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

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

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

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ Qt модСль/прСдставлСниС, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для отобраТСния Π² прСдставлСнии. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΡ‡Π΅Π½ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ потрСбности Π² памяти ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΌ считывания всСх Π΄Π°Π½Π½Ρ‹Ρ…. Бвязывая ΠΎΠ΄Π½Ρƒ модСль с двумя ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ прСдставлСниями, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π° счСт Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ·Π΄Π΅Ρ€ΠΆΠ΅ΠΊ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Π½ΠΈΠΌΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ способами. Qt автоматичСски синхронизируСт мноТСствСнныС прСдставлСния Π΄Π°Π½Π½Ρ‹Ρ… β€” измСнСния Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· прСдставлСний ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π²ΠΎ всСх Π΄Ρ€ΡƒΠ³ΠΈΡ…. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ прСимущСство Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ модСль/прСдставлСниС проявляСтся Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ способ хранСния исходных Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΌ просто потрСбуСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ модСль; прСдставлСния ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСбольшим количСством элСмСнтов. Π’ Ρ‚Π°ΠΊΠΎΠΉ ситуации, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ классы Qt ΠΏΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ элСмСнтов (QListWidget, QTableWidget ΠΈ QTreeWidget), нСпосрСдствСнно заполняя всС элСмСнты значСниями. Π­Ρ‚ΠΈ классы Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ классам отобраТСния элСмСнтов Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… вСрсиях Qt. Они хранят свои Π΄Π°Π½Π½Ρ‹Π΅ Π² «элСмСнтах» (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, QTableWidget содСрТит элСмСнты QTableWidgetltem). ΠŸΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этих ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… классов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ появлСниС Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… элСмСнтов Π² прСдставлСниях.

Рис. 10.2. Одна модСль ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ нСсколько прСдставлСний.

ΠŸΡ€ΠΈ использовании Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… часто оказываСтся нСдопустимым Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ этих случаях ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ классы Qt ΠΏΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ элСмСнтов (QListView, QTableView ΠΈ QTreeView) Π² сочСтании с модСлью Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠ°Ρ модСль, Ρ‚Π°ΠΊ ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² Qt ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. НапримСр, Ссли Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… хранится Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ QTableView Π² сочСтании с QSqlTableModel.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… классов отобраТСния элСмСнтов

Π£Π΄ΠΎΠ±Π½Ρ‹Π΅ Qt—подклассы отобраТСния элСмСнтов ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ модСль, ΠΈ ΠΎΠ½ΠΈ особСнно ΡƒΠ΄ΠΎΠ±Π½Ρ‹, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ прСдставлСния Π½Π°ΠΌ Π½Π΅ Π΄Π°Π΅Ρ‚ прСимущСства. ΠœΡ‹ использовали этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π² Π³Π»Π°Π²Π΅ 4, ΠΊΠΎΠ³Π΄Π° создавали подклассы QTableWidget ΠΈ QTableWidgetItem для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ классы отобраТСния элСмСнтов для Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° экран элСмСнтов. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ приводится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ QListWidget, Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ β€” Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ QTableWidget ΠΈ Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния QTreeWidget.

ΠœΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с простого Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΈΠ· списка символ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² Π±Π»ΠΎΠΊ-схСмах ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт состоит ΠΈΠ· ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, тСкста ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°.

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°:

01 class FlowChartSymbolPicker : public QDialog {

02 Q_OBJECT

03 public:

04 FlowChartSymbolPicker(const QMap<int, QString> &symbolMap,

05 QWidget *parent = 0);

06 int selectedId() const { return id; }

07 void done(int result);

08 …

09 }

Рис. 10.3. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π’Ρ‹Π±ΠΎΡ€ символа блок—схСмы (Flowchart Symbol Picker).

ΠŸΡ€ΠΈ создании Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ конструктору ассоциативный массив QMap<int, QString>, ΠΈ послС выполнСния конструктора ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта (ΠΈΠ»ΠΈ β€”1, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²Ρ‹Π±Ρ€Π°Π»), вызывая selectedId().

01 FlowChartSymbolPicker::FlowChartSymbolPicker(

02 const QMap<int, QString> &symbolMap, QWidget *parent)

03 : QDialog(parent)

04 {

05 id = -1;

06 listWidget = new QListWidget;

07 listWidget->setIconSize(QSize(60, 60));

08 QMapIterator<int, QString> i(symbolMap);

09 while (i.hasNext()) {

10 i.next();

11 QListWidgetItem *item = new QListWidgetItem(i.value(),

12 listWidget);

13 item->setIcon(iconForSymbol(i.value()));

14 item->setData(Qt::UserRole, i.key());

15 …

16 }

17 }

ΠœΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ id (ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ послСднСго Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ β€”1. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ конструируСм QListWidget β€” ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ отобраТСния элСмСнтов. ΠœΡ‹ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΏΠΎ всСм элСмСнтам ассоциативного массива символов блок—схСмы symbolMap ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QListWidgetItem. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ QListWidgetItem ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡƒΡŽ Π½Π° экран строку QString ΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ QListWidget.

Π—Π°Ρ‚Π΅ΠΌ Π·Π°Π΄Π°Π΅ΠΌ ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ элСмСнта ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ setData() для сохранСния Π² QListWidgetItem ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° элСмСнта. Закрытая функция iconForSymbol() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ QIcon для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ символа.

QListWidgetItem ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π² Ρ€Π°Π·Π½Ρ‹Ρ… ролях, ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… соотвСтствуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QVariant. Π‘Π°ΠΌΡ‹ΠΌΠΈ распространСнными ролями ΡΠ²Π»ΡΡŽΡ‚ΡΡ Qt::DisplayRole, Qt::EditRole ΠΈ Qt::IconRole, ΠΈ для Π½ΠΈΡ… прСдусмотрСны ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ установкС ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡŽ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (setText(), setIcon()), Π½ΠΎ имССтся Ρ‚Π°ΠΊΠΆΠ΅ нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ€ΠΎΠ»Π΅ΠΉ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ€ΠΎΠ»ΠΈ, задавая числовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ€Π°Π²Π½ΠΎΠ΅ ΠΈΠ»ΠΈ большСС, Ρ‡Π΅ΠΌ Qt::UserRole. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Qt::UserRole ΠΏΡ€ΠΈ сохранСнии ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта.

Π’ Π½Π΅ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ части конструктора ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ, выполняСтся ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² ΠΈ задаСтся Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π°.

01 void FlowChartSymbolPicker::done(int result)

02 {

03 id = -1;

04 if (result == QDialog::Accepted) {

05 QListWidgetItem *item = listWidget->currentItem();

06 if (item)

07 id = item->data(Qt::UserRole).toInt();

08 }

09 QDialog::done(result);

10 }

Ѐункция done() класса QDialog пСрСопрСдСляСтся. Она вызываСтся ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΎΠΊ ОК ΠΈΠ»ΠΈ Cancel. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ OK, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ доступ ΠΊ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ элСмСнту ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ data(). Если Π±Ρ‹ нас интСрСсовал тСкст элСмСнта, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π΅Π³ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° item->data(Qt::DisplayRole).toString() ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ простого Π²Ρ‹Π·ΠΎΠ²Π° item->text().

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ QListWidget ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния. Если Π±Ρ‹ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнты, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ рСдактирования прСдставлСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ QAbstractItemView::setEditTriggers(), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ QAbstractItemView::AnyKeyPressed ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ элСмСнта, просто Π½Π°Ρ‡Π°Π² Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ символы с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹. МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΈ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ рСдактирования Edit (ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΊΠ½ΠΎΠΏΠΊΠΈ добавлСния ΠΈ удалСния Add ΠΈ Delete) ΠΈ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΈΡ… со слотами, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ опСрациями рСдактирования.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ класс отобраТСния элСмСнтов для просмотра ΠΈ Π²Ρ‹Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΡ‹ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅. ΠœΡ‹ снова ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ Π½Π° этот Ρ€Π°Π· Π½Π°Π±ΠΎΡ€ Ρ‚ΠΎΡ‡Π΅ΠΊ с ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ (x, Ρƒ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ.

Рис. 10.4. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚.

Как ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΌΡ‹ основноС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡƒΠ΄Π΅Π»ΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ, относящСмуся ΠΊ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ элСмСнтов, ΠΈ Π½Π°Ρ‡Π½Π΅ΠΌ с конструктора.

01 CoordinateSetter::CoordinateSetter(QList<QPointF> *coords,

02 QWidget *parent)

03 : QDialog(parent)

04 {

05 coordinates = coords;

06 tableWidget = new QTableWidget(0, 2);

07 tableWidget->setHorizontalHeaderLabels(

08 QStringList() << tr("X") << tr("Y"));

09 for (int row = 0; row < coordinates->count(); ++row) {

10 QPointF point = coordinates->at(row);

11 addRow();

12 tableWidget->item(row, 0)->setText(

13 QString::number(point.x()));

14 tableWidget->item(row, 1)->setText(

15 QString::number(point.y()));

16 }

17 …

18 }

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ QTableWidget ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ число строк ΠΈ столбцов Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΠΎΠΉ Π½Π° экран. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² QTableWidget прСдставлСн ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ QTableWidgetltem, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ элСмСнты Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² строк ΠΈ столбцов. Ѐункция setHorizontalHeaderLabels() Π·Π°Π΄Π°Π΅Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ всСм столбцам, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ тСкст ΠΈΠ· ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ списка строк. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ QTableWidget обСспСчиваСт Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ строк числовыми ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ, начиная с 1; ΠΈΠΌΠ΅Π½Π½ΠΎ это Π½Π°ΠΌ ΠΈ Π½ΡƒΠΆΠ½ΠΎ, поэтому Π½Π°ΠΌ Π½Π΅ приходится Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ строк.