Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 61

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

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&regExp)

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() для измСнСния отобраТСния столбца Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ.