Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ
ΠΠ°ΡΠ°Π½Π΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π² 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(¤cyModel);
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() ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π»ΡΠ±ΠΎΠΌΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΡΠΎ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½Ρ; ΡΡΠΎ Π²ΡΠ½ΡΠΆΠ΄Π°Π΅Ρ ΠΈΡ Π·Π°ΠΏΡΠΎΡΠΈΡΡ ΡΠ²Π΅ΠΆΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΈΠ΄Π½Ρ Π½Π° ΡΠΊΡΠ°Π½Π΅.