01 int RegExpModel::columnCount(const QModelIndex &
02 /* ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ */) const
03 {
04 return 2;
05 }
Π§ΠΈΡΠ»ΠΎ ΡΡΠΎΠ»Π±ΡΠΎΠ² ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΈ ΡΠ°Π²Π½ΠΎ 2. ΠΠ΅ΡΠ²ΡΠΉ ΡΡΠΎΠ»Π±Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΈΠΏΡ Π²Π΅ΡΡΠΈΠ½; Π²ΡΠΎΡΠΎΠΉ ΡΡΠΎΠ»Π±Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²Π΅ΡΡΠΈΠ½.
01 QModelIndex RegExpModel::parent(const QModelIndex
02 &child) const
03 {
04 Node*node = nodeFromIndex(child);
05 if (!node)
06 return QModelIndex();
07 Node *parentNode = node->parent;
08 if (!parentNode)
09 return QModelIndex();
10 Node *grandparentNode = parentNode->parent;
11 if (!grandparentNode)
12 return QModelIndex();
13 int row = grandparentNode->children.indexOf(parentNode);
14 return createIndex(row, child.column(), parentNode);
15 }
ΠΠΎΠ»ΡΡΠΈΡΡ QModelIndex ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈΠ· Π΄ΠΎΡΠ΅ΡΠ½Π΅Π³ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅, ΡΠ΅ΠΌ Π½Π°ΠΉΡΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ. ΠΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΡΡ Π²Π΅ΡΡΠΈΠ½Ρ, ΠΏΡΠΈΠΌΠ΅Π½ΡΡ ΡΠ½Π°ΡΠ°Π»Π° ΡΡΠ½ΠΊΡΠΈΡ nodeFromIndex() ΠΈ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡΡΡ Π·Π°ΡΠ΅ΠΌ Π²Π²Π΅ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, Π½ΠΎ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π½ΠΎΠΌΠ΅ΡΠ° ΡΡΡΠΎΠΊΠΈ (ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌ ΡΠΏΠΈΡΠΊΠ΅ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ Π²Π΅ΡΡΠΈΠ½) ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈ Π½Π°ΠΉΡΠΈ Π² Π΅Π³ΠΎ ΡΠΏΠΈΡΠΊΠ΅ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ (ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ Π΄ΠΎΡΠ΅ΡΠ½Π΅ΠΉ Π²Π΅ΡΡΠΈΠ½Ρ).
01 QVariant RegExpModel::data(const QModelIndex
02 &index, int role) const
03 {
04 if (role != Qt::DisplayRole)
05 return QVariant();
06 Node *node = nodeFromIndex(index);
07 if (!node)
08 return QVariant();
09 if (index.column() == 0) {
10 switch (node->type) {
11 case Node::RegExp:
12 return tr("RegExp");
13 case Node::Expression:
14 return tr("Expression");
15 case Node::Term:
16 return tr("Term");
17 case Node::Factor:
18 return tr("Factor");
19 case Node::Atom:
20 return tr("Atom");
21 case Node::Terminal:
22 return tr("Terminal");
23 default:
24 return tr("Unknown");
25 }
26 } else if (index.column() == 1) {
27 return node->str;
28 }
29 return QVariant();
30 }
Π ΡΡΠ½ΠΊΡΠΈΠΈ data() ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π΄Π»Ρ Π·Π°ΠΏΡΠΎΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Node * ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΅Π³ΠΎ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π΄Π°Π½Π½ΡΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠ½Ρ. ΠΡΠ»ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΠΊΠ°ΠΊΡΡ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠΎΠ»Ρ, ΠΎΡΠ»ΠΈΡΠ½ΡΡ ΠΎΡ Qt::DisplayRole, ΠΈΠ»ΠΈ Π΅ΡΠ»ΠΈ Π½Π΅ ΡΠ΄Π°Π΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π²Π΅ΡΡΠΈΠ½Ρ Node Π΄Π»Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° QVariant. ΠΡΠ»ΠΈ ΡΡΠΎΠ»Π±Π΅Ρ ΡΠ°Π²Π΅Π½ 0, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Π²Π΅ΡΡΠΈΠ½Ρ; Π΅ΡΠ»ΠΈ ΡΡΠΎΠ»Π±Π΅Ρ ΡΠ°Π²Π΅Π½ 1, Π²Π±Π·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠ½Ρ (Π΅Π΅ ΡΡΡΠΎΠΊΡ).
01 QVariant RegExpModel::headerData(int section,
02 Qt::Orientation orientation, int role) const
03 {
04 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
05 if (section == 0) {
06 return tr("Node");
07 else if (section == 1) {
08 return tr("Value");
09 }
10 }
11 return QVariant();
12 }
ΠΡΠΈ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ headerData() ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΌΠ΅ΡΠΊΠΈ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°. ΠΠ»Π°ΡΡ QTreeView, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΡΡΡΠΎΠΊ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΈΡ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌ.
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Ρ ΠΊΠ»Π°ΡΡΡ Node ΠΈ RegExpModel, Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΊΠΎΡΠ½Π΅Π²Π°Ρ Π²Π΅ΡΡΠΈΠ½Π°, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠ΅ΠΊΡΡ Π² ΡΡΡΠΎΠΊΠ΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
01 void RegExpWindow::regExpChanged(const QString®Exp)
02 {
03 RegExpParser parser;
04 Node *rootNode = parser.parse(regExp);
05 regExpModel->setRootNode(rootNode);
06 }
ΠΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΡΠ΅ΠΊΡΡΠ° Π² ΡΡΡΠΎΠΊΠ΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠ»ΠΎΡ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° regExpChanged(). Π ΡΡΠΎΠΌ ΡΠ»ΠΎΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΡΠ΅ΠΊΡΡΠ°, ΠΈ ΠΏΠ°ΡΡΠ΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΊΠΎΡΠ½Π΅Π²ΡΡ Π²Π΅ΡΡΠΈΠ½Ρ Π΄Π΅ΡΠ΅Π²Π° Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΎΡΠ°.
ΠΡ Π½Π΅ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΊΠ»Π°ΡΡ RegExpParser, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ/ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ. ΠΠΎΠ»Π½ΡΠΉ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ΅.
Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΌΡ ΡΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΡΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ Π²ΡΡΠ΅ ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΠΌΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π ΡΠ°ΠΌΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Qt Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ/ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ Π΄Π΅Π»Π΅Π³Π°ΡΠΎΠ²
ΠΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π΅Π»Π΅Π³Π°ΡΠΎΠ². Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π΅Π»Π΅Π³Π°ΡΠ°, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΡΠΌΠΈ. ΠΡΠ»ΠΈ Π½Π°ΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ½ΠΊΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΌΡ ΡΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠΎΠ³ΠΎ Π΄ΠΎΠ±ΠΈΡΡΡΡ, ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ: ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ data() ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠΎΠ»Π΅ΠΉ Qt::FontRole, Qt::TextAlignmentRole, Qt::TextColorRole ΠΈ Qt::BackgroundColorRole, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π΅Π»Π΅Π³Π°ΡΠΎΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ Π²ΡΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ ΠΠΎΡΠΎΠ΄Π° ΠΈ ΠΡΡΡΡ Π²Π°Π»ΡΡ ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ»ΠΈ Qt::TextAlignmentRole Π΄Π»Ρ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΡ ΡΠΈΡΠ΅Π» Π²ΠΏΡΠ°Π²ΠΎ.
ΠΡΠ»ΠΈ Π½Π°ΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΅ΡΠ΅ Π±ΠΎΠ»ΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ, ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ Π½Π°Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΊΠ»Π°ΡΡ Π΄Π΅Π»Π΅Π³Π°ΡΠ° ΠΈ ΡΠ²ΡΠ·Π°ΡΡ Π΅Π³ΠΎ Ρ Π½ΡΠΆΠ½ΡΠΌΠΈ Π½Π°ΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡΠΌΠΈ. Π ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ Π Π΅Π΄Π°ΠΊΡΠΎΡ ΡΠΎΠ½ΠΎΠ³ΡΠ°ΠΌΠΌ (Track Editor) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ Π΄Π΅Π»Π΅Π³Π°Ρ. Π ΡΡΠΎΠΌ ΠΎΠΊΠ½Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΌΡΠ·ΡΠΊΠ°Π»ΡΠ½ΡΡ ΡΠΎΠ½ΠΎΠ³ΡΠ°ΠΌΠΌ ΠΈ ΠΈΡ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ. ΠΠ°Π½Π½ΡΠ΅ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ Π±ΡΠ΄ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΠΏΡΠΎΡΡΠΎ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ QString (Π½Π°Π·Π²Π°Π½ΠΈΡ) ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠΈΠΏΠ° int (ΡΠ΅ΠΊΡΠ½Π΄Ρ), ΠΎΠ΄Π½Π°ΠΊΠΎ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ ΡΠ°Π·Π±ΠΈΡΠ° Π½Π° ΠΌΠΈΠ½ΡΡΡ ΠΈ ΡΠ΅ΠΊΡΠ½Π΄Ρ, Π° Π΅Π΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ QTimeEdit.
Π ΠΈΡ. 10.15. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π Π΅Π΄Π°ΠΊΡΠΎΡ ΡΠΎΠ½ΠΎΠ³ΡΠ°ΠΌΠΌ.
ΠΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π Π΅Π΄Π°ΠΊΡΠΎΡ ΡΠΎΠ½ΠΎΠ³ΡΠ°ΠΌΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ QTableWidget β ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ QTableWidgetltem. ΠΠ°Π½Π½ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π² Π²ΠΈΠ΄Π΅ ΡΠΏΠΈΡΠΊΠ° ΡΠΎΠ½ΠΎΠ³ΡΠ°ΠΌΠΌ Track:
01 class Track
02 {
03 public:
04 Track(const QString &title = "", int duration = 0);
05 QString title;
06 int duration;
07 };
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°, ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΉ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΈ ΠΏΠΎΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ°Π±Π»ΠΈΡΠ½ΡΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ:
01 TrackEditor::TrackEditor(QList<Track> *tracks, QWidget *parent)
02 : QDialog(parent)
03 {
04 this->tracks = tracks;
05 tableWidget = new QTableWidget(tracks->count(), 2);
06 tableWidget->setItemDelegate(new TrackDelegate(1));
07 tableWidget->setHorizontalHeaderLabels(
08 QStringList() << tr("Track") << tr("Duration"));
09 for (int row = 0; row < tracks->count(); ++row) {
10 Track track = tracks->at(row);
11 QTableWidgetltem *item0 = new QTableWidgetItem(track.titie);
12 tableWidget->setItem(row, 0, item0);
13 QTableWidgetltem *item1 = new QTableWidgetItem(
14 QString::number(track.duration));
15 item1->setTextAlignment(Qt::AlignRight);
16 tableWidget->setItem(row, 1, item1);
17 }
18 β¦
19 }
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ½ΡΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ ΠΈ, Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π΅Π»Π΅Π³Π°ΡΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΡΠ²ΡΠ·ΡΠ²Π°Π΅Ρ Π²ΠΈΠ΄ΠΆΠ΅Ρ Ρ Π½Π°ΡΠΈΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌ Π΄Π΅Π»Π΅Π³Π°ΡΠΎΠΌ TrackDelegate, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ Π΅ΠΌΡ Π½ΠΎΠΌΠ΅Ρ ΡΡΠΎΠ»Π±ΡΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. ΠΡ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΡΡΠΎΠ»Π±ΡΠΎΠ² ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΠΌ Π² ΡΠΈΠΊΠ»Π΅ ΠΏΠΎ Π²ΡΠ΅ΠΌ Π΄Π°Π½Π½ΡΠΌ, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠΎΠ½ΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ Π΅Π΅ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ.
Π ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° TrackEditor Π½Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠ»Π°ΡΡ trackDelegate, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΡΠΎΠ½ΠΎΠ³ΡΠ°ΠΌΠΌΡ.
01 class TrackDelegate : public QItemDelegate
02 {
03 Q_OBJECT
04 public:
05 TrackDelegate(int durationColumn, QObject *parent = 0);
06 void paint(QPainter *painter, const
07 QStyleOptionViewItem &option,
08 const QModelIndex &index) const;
09 QWidget *createEditor(QWidget *parent,
10 const QStyleOptionViewItem &option,
11 const QModelIndex &index) const;
12 void setEditorData(QWidget *editor,
13 const QModelIndex &index) const;
14 void setModelData(QWidget *editor,
15 QAbstractItemModel *model,
16 const QModelIndex &index) const;
17 private slots:
18 void commitAndCloseEditor();
19 private:
20 int durationColumn;
21 };
ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ QItemDelegate Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π½Π°ΡΠ΅Π³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ Π΄Π΅Π»Π΅Π³Π°ΡΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ QAbstractItemDelegate, Π΅ΡΠ»ΠΈ Π±Ρ Ρ ΠΎΡΠ΅Π»ΠΈ Π½Π°ΡΠ°ΡΡ Ρ ΡΠΈΡΡΠΎΠ³ΠΎ Π»ΠΈΡΡΠ°. ΠΠ»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π² Π΄Π΅Π»Π΅Π³Π°ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ createEditor(), setEditorData() ΠΈ setModelData(). ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ paint() Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΡΠΎΠ»Π±ΡΠ° Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠ΅ΠΉ.