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

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

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

РСализация ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ

Π—Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² Qt ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ срСдства ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ просмотра Π΄Π°Π½Π½Ρ‹Ρ…. Однако Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ источники Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ эффСктивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для этих ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, ΠΈ Π² этих случаях Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΡ… источников Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ созданию ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Qt модСль/прСдставлСниС. Π’ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΈΠΌΠ΅Π΅Ρ‚ индСкс ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Π½Π°Π±ΠΎΡ€ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ролями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ значСния. Π Π°Π½Π΅Π΅ Π² Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнными ролями ΡΠ²Π»ΡΡŽΡ‚ΡΡ Qt::DisplayRole ΠΈ Qt::EditRole. Π”Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€ΠΎΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Qt::ToolTipRole, Qt::StatusTipRole ΠΈ Qt::WhatsThisRole) ΠΈΠ»ΠΈ для управлСния основными Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ отобраТСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Qt::FontRole, Qt::TextAlignmentRole, Qt::TextColorRole ΠΈ Qt::BackgroundColorRole).

Рис. 10.9. БхСматичСскоС прСдставлСниС ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Qt.

Π’ ΠΌΠΎΠ΄Π΅Π»ΠΈ списка ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ индСксным ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ β€” Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ строки, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QModelIndex::row(). Π’ ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Π²Π° индСксных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° β€” Π½ΠΎΠΌΠ΅Ρ€ строки ΠΈ Π½ΠΎΠΌΠ΅Ρ€ столбца, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QModelIndex::row() ΠΈ QModelIndex::column(). Π’ модСлях списка ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ элСмСнт всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов являСтся ΠΊΠΎΡ€Π½Π΅Π²Ρ‹ΠΌ элСмСнтом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставдяСтся Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ индСксом ΠΌΠΎΠ΄Π΅Π»ΠΈ QModelIndex. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†.

МодСль Π΄Π΅Ρ€Π΅Π²Π° ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… отличиях. Как ΠΈ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ элСмСнт элСмСнтов Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня являСтся ΠΊΠΎΡ€Π½Π΅Π²Ρ‹ΠΌ (ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ QModelIndex), ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ элСмСнт любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ элСмСнта Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ мСсто Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ элСмСнтов. Доступ ΠΊ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ элСмСнтам ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QModelIndex::parent(). ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΈΠΌΠ΅Π΅Ρ‚ свои Ρ€ΠΎΠ»Π΅Π²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ элСмСнты, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… являСтся Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ элСмСнтом. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ любой элСмСнт ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ элСмСнты, Ρ‚Π°ΠΊΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ рСкурсивно (Π² Π²ΠΈΠ΄Π΅ Π΄Π΅Ρ€Π΅Π²Π°), Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ продСмонстрировано Π² послСднСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π°.

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ этого Ρ€Π°Π·Π΄Π΅Π»Π° прСдставлСна модСль Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния; ΠΎΠ½Π° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ курсы Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²Π°Π»ΡŽΡ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°.

Рис. 10.10. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠšΡƒΡ€ΡΡ‹ Π²Π°Π»ΡŽΡ‚ (Currencies).

Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ простой Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π½ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ модСль, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ свойствами Π΄Π°Π½Π½Ρ‹Ρ… для обСспСчСния минимального расхода памяти. Если Π±Ρ‹ ΠΌΡ‹ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ 162 Π²Π°Π»ΡŽΡ‚Ρ‹, Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² настоящСС врСмя, Π½Π°ΠΌ Π±Ρ‹ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ 162 Γ— 162 = 26 244 значСния; Π² прСдставлСнной Π½ΠΈΠΆΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 162 значСния (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π°Π»ΡŽΡ‚Ρ‹ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»Π»Π°Ρ€Π° БША).

Класс CurrencyModel Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ совмСстно со стандартным Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΌ прСдставлСниСм QTableView. МодСль CurrencyModel пополняСтся элСмСнтами QMap<QString, double>; ΠΊΠ»ΡŽΡ‡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта прСдставляСт собой ΠΊΠΎΠ΄ Π²Π°Π»ΡŽΡ‚Ρ‹, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” курс Π²Π°Π»ΡŽΡ‚Ρ‹ Π² Π΄ΠΎΠ»Π»Π°Ρ€Π°Ρ… БША. НиТС приводится Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, ΠΊΠ°ΠΊ пополняСтся ассоциативный массив QMap ΠΈ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ модСль:

QMap<QString, double> currencyMap;

currencyMap.insert("AUD", 1.3259);

currencyMap.insert("CHF", 1.2970);

…

currencyMap.insert("SGD", 1.6901);

currencyMap.insert("USD", 1.0000);

CurrencyModel currencyModel;

currencyModel.setCurrencyMap(currencyMap);

QTableView tableView;

tableView.setModel(&currencyModel);

tableView.setAlternatingRowColors(true);

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ, начиная с Π΅Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°:

01 class CurrencyModel : public QAbstractTableModel

02 {

03 public:

04 CurrencyModel(QObject *parent = 0);

05 void setCurrencyMap(const QMap<QString, double> &map);

06 int rowCount(const QModelIndex &parent) const;

07 int columnCount(const QModelIndex &parent) const;

08 QVariant data(const QModelIndex &index, int role) const;

09 QVariant headerData(int section, Qt::Orientation orientation,

10 int role) const;

11 private:

12 QString currencyAt(int offset) const;

13 QMap<QString, double> currencyMap;

14 };

Для нашСй ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΡ‹ использовали подкласс QAbstractTableModel, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ источнику Π΄Π°Π½Π½Ρ‹Ρ…. Qt содСрТит нСсколько Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ QAbstractListModel, QAbstractTableModel ΠΈ QAbstractItemModel. Класс QAbstractItemModel ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, Π² Ρ‚ΠΎΠΌ числС Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ построСны Π½Π° рСкурсивных структурах Π΄Π°Π½Π½Ρ‹Ρ…, Π° классы QAbstractListModel ΠΈ QAbstractTableModel ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… ΠΈ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Ρ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

Рис. 10.11. Π”Π΅Ρ€Π΅Π²ΠΎ наслСдования для абстрактных классов ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ.

Для ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: rowCount(), columnCount() ΠΈ data(). Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ headerData() ΠΈ обСспСчили Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (setCurrencyMap()).

01 CurrencyModel::CurrencyModel(QObject*parent)

02 : QAbstractTableModel(parent)

03 {

04 }

Π’ конструкторС Π½Π°ΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π½Π°Π΄ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡƒ классу parent Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

01 int CurrencyModel::rowCount(const QModelIndex &

02 /* Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ элСмСнт */) const

03 {

04 return currencyMap.count();

05 }


06 int CurrencyModel::columnCount(const QModelIndex &

07 /* Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ элСмСнт */) const

08 {

09 return currencyMap.count();

10 }

Π’ этой Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ счСтчики строк ΠΈ столбцов ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π½ΠΎΠΌΠ΅Ρ€Π° Π²Π°Π»ΡŽΡ‚ Π² ассоциативном массивС Π²Π°Π»ΡŽΡ‚. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ parent Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹; ΠΎΠ½ здСсь ΡƒΠΊΠ°Π·Π°Π½, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ rowCount() ΠΈ columnCount() Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса QAbstractItemModel, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ иСрархичСскиС структуры.

01 QVariant CurrencyModel::data(const QModelIndex &index, int role) const

02 {

03 if (!index.IsValid())

04 return QVariant();

05 if (role == Qt::TextAlignmentRole) {

06 return int(Qt::AlignRight | Qt::AlignVCenter);

07 } else if (role == Qt::DisplayRole) {

08 QString rowCurrency = currencyAt(index.row());

09 QString columnCurrency = currencyAt(index.column());

10 if (currencyMap.value(rowCurrency) == 0.0)

11 return "####";

12 double amount = currencyMap.value(columnCurrency)

13 / currencyMap.value(rowCurrency);

14 return QString("%1").arg(amount, 0, 'f', 4);

15 }

16 return QVariant();

17 }

Ѐункция data() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ любой ΠΎΠ΄Π½ΠΎΠΉ Ρ€ΠΎΠ»ΠΈ элСмСнта. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ опрСдСляСтся индСксом QModelIndex. Π’ ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ интСрСс Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ QModelIndex, ΠΊΠ°ΠΊ Π½ΠΎΠΌΠ΅Ρ€ строки ΠΈ Π½ΠΎΠΌΠ΅Ρ€ столбца, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ row() ΠΈ column().

Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€ΠΎΠ»ΡŒ Qt::TextAlignmentRole, ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, подходящСС для выравнивания чисСл. Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€ΠΎΠ»ΡŒ Qt::DisplayRole, ΠΌΡ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π°Π»ΡŽΡ‚Ρ‹ ΠΈ вычисляСм курс ΠΎΠ±ΠΌΠ΅Π½Π°.

ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ рассчитанноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° double, Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ послС дСсятичной Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ числа (Ссли ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π΄Π΅Π»Π΅Π³Π°Ρ‚). ВмСсто этого ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π²ΠΈΠ΄Π΅ строки, ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π½ΡƒΠΆΠ½Ρ‹ΠΌ Π½Π°ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

01 QVariant CurrencyModel::headerData(int section,

02 Qt::Orientation /* ориСнтация */, int role) const

03 {

04 if (role != Qt::DisplayRole)

05 return QVariant();

06 return currencyAt(section);

07 }

Ѐункция headerData() вызываСтся прСдставлСниСм для пополнСния своих Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ². ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ section содСрТит Π½ΠΎΠΌΠ΅Ρ€ строки ΠΈΠ»ΠΈ столбца (Π² зависимости ΠΎΡ‚ ΠΎΡ€ΠΈΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ строки ΠΈ столбцы содСрТат ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹ Π²Π°Π»ΡŽΡ‚, Π½Π°ΠΌ Π½Π΅ Π½Π°Π΄ΠΎ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± ΠΎΡ€ΠΈΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π° просто Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΊΠΎΠ΄ Π²Π°Π»ΡŽΡ‚Ρ‹ для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ значСния section.

01 void CurrencyModel::setCurrencyMap(const QMap<QString, double> &map)

02 {

03 currencyMap = map;

04 reset();

05 }

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