05 }
ΠΡΠ·ΡΠ²Π°ΡΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π½Π°Π±ΠΎΡ Π²Π°Π»ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΡ setCurrencyMap(). ΠΡΠ·ΠΎΠ² QAbstractItemModel::reset() ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π»ΡΠ±ΠΎΠΌΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΡΠΎ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½Ρ; ΡΡΠΎ Π²ΡΠ½ΡΠΆΠ΄Π°Π΅Ρ ΠΈΡ Π·Π°ΠΏΡΠΎΡΠΈΡΡ ΡΠ²Π΅ΠΆΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΈΠ΄Π½Ρ Π½Π° ΡΠΊΡΠ°Π½Π΅.
01 QString CurrencyModel::currencyAt(int offset) const
02 {
03 return (currencyMap.begin() + offset).key();
04 }
Π€ΡΠ½ΠΊΡΠΈΡ currencyAt() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠ»ΡΡ (ΠΊΠΎΠ΄ Π²Π°Π»ΡΡΡ), ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π² Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΠΎΠΌ ΠΌΠ°ΡΡΠΈΠ²Π΅ Π²Π°Π»ΡΡ. ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ Π² ΡΡΠΈΠ»Π΅ STL Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΡ key().
ΠΠ°ΠΊ ΠΌΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΠΌΠΎΠ³Π»ΠΈ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, Π½Π΅ΡΡΡΠ΄Π½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, ΠΈ ΠΏΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ Π² Ρ ΠΎΡΠΎΡΠΎ ΡΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ ΠΏΠ°ΠΌΡΡΡ ΠΈ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ Π±ΡΡΡΡΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΠΎΡΠΎΠ΄Π° (Cities) ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ°Π±Π»ΠΈΡΠ½Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ, Π½ΠΎ Π½Π° ΡΡΠΎΡ ΡΠ°Π· Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π²Π²ΠΎΠ΄ΡΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ.
ΠΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ Π»ΡΠ±ΡΠΌΠΈ Π΄Π²ΡΠΌΡ Π³ΠΎΡΠΎΠ΄Π°ΠΌΠΈ. ΠΠ°ΠΊ ΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π±Π»ΠΈΡΠ½ΡΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ QTableWidget ΠΈ Ρ ΡΠ°Π½ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°ΡΡ Π³ΠΎΡΠΎΠ΄ΠΎΠ². ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠ°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΌΠΎΠ³Π»Π° Π±Ρ Π±ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΉ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΡ Π»ΡΠ±ΠΎΠ³ΠΎ Π³ΠΎΡΠΎΠ΄Π° Π Π΄ΠΎ Π»ΡΠ±ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π³ΠΎΡΠΎΠ΄Π° Π Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΎΠ³ΠΎ, Π±ΡΠ΄Π΅ΠΌ Π»ΠΈ ΠΌΡ ΠΏΡΡΠ΅ΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΎΡ Π Π΄ΠΎ Π ΠΈΠ»ΠΈ ΠΎΡ Π Π΄ΠΎ Π, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ ΠΎΡ Π³Π»Π°Π²Π½ΠΎΠΉ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡΡΡ ΠΏΡΡΠ΅ΠΌ Π·Π΅ΡΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π΄ΡΡΠ³ΠΎΠΉ.
ΠΠ»Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ΠΉ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Ρ Π½Π°Ρ ΠΈΠΌΠ΅Π΅ΡΡΡ ΡΡΠΈ Π³ΠΎΡΠΎΠ΄Π°: Π, Π ΠΈ Π‘. ΠΠ»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠΉ Π½Π°ΠΌ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ Ρ ΡΠ°Π½ΠΈΡΡ Π΄Π΅Π²ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ. Π Π°ΠΊΠΊΡΡΠ°ΡΠ½ΠΎ ΡΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎΡΡ Π±Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°: (Π, Π), (A, Π‘) ΠΈ (Π, Π‘).
Π ΠΈΡ. 10.12. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΠΎΡΠΎΠ΄Π°.
ΠΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ:
QStringList cities;
cities << "Arvika" << "Boden" << "Eskilstuna" << "Falun"
<< "Filipstad" << "Halmstad" << "Helsingborg" << "Karlstad"
<< "Kiruna" << "Kramfors" << "Motala" << "Sandviken"
<< "Skara" << "Stockholm" << "Sundsvall" << "Trelleborg";
CityModel CityModel;
cityModel.setCities(cities);
QTableView tableView;
tableView.setModel(&cityModel);
tableView.setAlternatingRowColors(true);
ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠ΅ ΠΆΠ΅ ΡΠ°ΠΌΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ»ΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ setData() ΠΈ flags(). ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ°:
01 class CityModel : public QAbstractTableModel
02 {
03 Q_OBJECT
04 public:
05 CityModel(QObject *parent = 0);
06 void setCities(const QStringList &cityNames);
07 int rowCount(const QModelIndex &parent) const;
08 int columnCount(const QModelIndex &parent) const;
09 QVariant data(const QModelIndex &index, int role) const;
10 bool setData(const QModelIndex &index, const QVariant &value,
11 int role);
12 QVariant headerData(int section, Qt::Orientation orientation,
13 int role) const;
14 Qt::ItemFlags flags(const QModelIndex &index) const;
15 private:
16 int offsetOf(int row, int column) const;
17 QStringList cities;
18 QVector<int> distanΡes;
19 };
Π ΡΡΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄Π²Π΅ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ : cities ΡΠΈΠΏΠ° QStringList Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π½Π°Π·Π²Π°Π½ΠΈΠΉ Π³ΠΎΡΠΎΠ΄ΠΎΠ², ΠΈ distances ΡΠΈΠΏΠ° QVector<int> Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ Π³ΠΎΡΠΎΠ΄Π°ΠΌΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠ°ΡΡ.
01 CityModel::CityModel(QObject *parent)
02 : QAbstractTableModel(parent)
03 {
04 }
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ parent Π±Π°Π·ΠΎΠ²ΠΎΠΌΡ ΠΊΠ»Π°ΡΡΡ ΠΈ Π±ΠΎΠ»ΡΡΠ΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ.
01 int CityModel::rowCount(const QModelIndex &
02 /* ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ */) const
03 {
04 return cities.count();
05 }
06 int CityModel::columnCount(const QModelIndex &
07 /* ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ */) const
08 {
09 return cities.count();
10 }
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΡΡ ΠΌΠ°ΡΡΠΈΡΡ Π³ΠΎΡΠΎΠ΄ΠΎΠ², ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΡΠΎΠΊ ΠΈ ΡΡΠΎΠ»Π±ΡΠΎΠ² ΡΠ°Π²Π½ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Ρ Π³ΠΎΡΠΎΠ΄ΠΎΠ² Π² Π½Π°ΡΠ΅ΠΌ ΡΠΏΠΈΡΠΊΠ΅.
01 QVariant CityModel::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 if (index.row() == index.column())
09 return 0;
10 int offset = offsetOf(index.row(), index.column());
11 return distances[offset];
12 }
13 return QVariant();
14 }
Π€ΡΠ½ΠΊΡΠΈΡ data() Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π° ΡΠΎΠΉ ΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² Π½Π°ΡΠ΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ CurrencyModel. ΠΠ½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ 0, Π΅ΡΠ»ΠΈ ΡΡΡΠΎΠΊΠ° ΠΈ ΡΡΠΎΠ»Π±Π΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΉ Π½ΠΎΠΌΠ΅Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΄Π²Π° Π³ΠΎΡΠΎΠ΄Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ; Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½Π° Π½Π°Ρ ΠΎΠ΄ΠΈΡ Π² Π²Π΅ΠΊΡΠΎΡΠ΅ distances ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π΄Π»Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΡΠΎΠ»Π±ΡΠ°, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Ρ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ Π΄Π»Ρ ΡΡΠΎΠΉ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΠΏΠ°ΡΡ Π³ΠΎΡΠΎΠ΄ΠΎΠ².
01 QVariant CityModel::headerData(int section,
02 Qt::Orientation /* ΠΎΡΠΈΠ΅Π½ΡΠ°ΡΠΈΡ */,
03 int role) const
04 {
05 if (role == Qt::DisplayRole)
06 return cities[section];
07 return QVariant();
08 }
Π€ΡΠ½ΠΊΡΠΈΡ headerData() ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠΎΡΡΠΎΠΉ Π²ΠΈΠ΄, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΠ΅ΠΉ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΈ ΡΡΠΎΠ»Π±ΡΡ ΠΈΠΌΠ΅ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ. ΠΡ ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π³ΠΎΡΠΎΠ΄Π°, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Ρ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π² ΡΠΏΠΈΡΠΊΠ΅ ΡΡΡΠΎΠΊ cities.
01 bool CityModel::setData(const QModelIndex &index,
02 const QVariant &value, int role)
03 {
04 if (index.isValid() && index.row() != index.column()
05 && role == Qt::EditRole) {
06 int offset = offsetOf(index.row(), index.column());
07 distances[offset] = value.toInt();
08 QModelIndex transposedIndex = createIndex(
09 index.column(), index.row());
10 emit dataChanged(index, index);
11 emit dataChanged(transposedIndex, transposedIndex);
12 return true;
13 }
14 return false;
15 }
Π€ΡΠ½ΠΊΡΠΈΡ setData() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ. ΠΡΠ»ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π΅Π½, Π΄Π²Π° Π³ΠΎΡΠΎΠ΄Π° ΡΠ°Π·Π»ΠΈΡΠ½Ρ ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅ΠΌΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π΄Π°Π½Π½ΡΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠ»Π΅Π²ΠΎΠΉ Π°ΡΡΠΈΠ±ΡΡ Qt::EditRole, ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² Π²Π΅ΠΊΡΠΎΡΠ΅ distances.
Π€ΡΠ½ΠΊΡΠΈΡ createIndex() ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠΠ½Π° Π½ΡΠΆΠ½Π° Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ ΠΏΠΎ Π΄ΡΡΠ³ΡΡ ΡΡΠΎΡΠΎΠ½Ρ ΠΎΡ Π³Π»Π°Π²Π½ΠΎΠΉ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ ΠΈ ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ±Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. Π€ΡΠ½ΠΊΡΠΈΡ createIndex() ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠ½Π°ΡΠ°Π»Π° ΡΡΡΠΎΠΊΡ ΠΈ Π·Π°ΡΠ΅ΠΌ ΡΡΠΎΠ»Π±Π΅Ρ; Π·Π΄Π΅ΡΡ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎ Π΄ΡΡΠ³ΡΡ ΡΡΡΠΎΠ½Ρ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ Π½Π°ΠΏΡΠΎΡΠΈΠ² ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ index.
ΠΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ ΡΠΈΠ³Π½Π°Π» dataChanged() Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄Π²Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ, ΠΎΡ Π²Π°ΡΡΠ²Π°ΡΡΠ΅ΠΉ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊ ΠΈ ΡΡΠΎΠ»Π±ΡΠΎΠ², ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡΠ³Π»Π° ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ ΡΠ³Π»Π° ΡΡΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ. ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ ΡΠ°ΠΊΠΆΠ΅ ΡΠΈΠ³Π½Π°Π» dataChanged() Π΄Π»Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»ΠΎ Π΅Π³ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΊΡΠ°Π½Π΅. ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ true ΠΈΠ»ΠΈ false, ΡΠΊΠ°Π·ΡΠ²Π°Ρ Π½Π° ΡΡΠΏΠ΅ΡΠ½ΠΎΡΡΡ ΠΈΠ»ΠΈ Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΎΡΡΡ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
01 Qt::ItemFiags CityModel::flags(const QModelIndex &index) const
02 {
03 Qt::ItemFlags flags = QAbstractItemModel::flags(index);
04 if (index.row() != index.column())
05 flags |= Qt::ItemIsEditable;
06 return flags;
07 }
Π€ΡΠ½ΠΊΡΠΈΡ flags() ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠΎΠ΄Π΅Π»ΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΠΎΠΎΠ±ΡΠΈΡΡ ΠΎ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΡ Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ Π»ΠΈ ΠΎΠ½ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅). ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΌΠΎΠ΄Π΅Π»ΠΈ QAbstractTableModel Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Qt::ItemIsSelectable | Qt::ItemIsEnabled. ΠΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠ»Π°ΠΆΠΎΠΊ Qt::ItemIsEditable Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΊΡΠΎΠΌΠ΅ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΡ ΠΏΠΎ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ (ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠ΅Π³Π΄Π° ΡΠ°Π²Π½Ρ 0).
01 void CityModel::setCities(const QStringList &cityNames)
02 {
03 cities = cityNames;
04 distances.resize(cities.count() * (cities.count() - 1) / 2);
05 distances.fill(0);
06 reset();
07 }
ΠΡΠ»ΠΈ Π·Π°Π΄Π°Π½ Π½ΠΎΠ²ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ Π³ΠΎΡΠΎΠ΄ΠΎΠ², ΠΌΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π·Π°ΠΊΡΡΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΈΠΏΠ° QStringList Π½Π° Π½ΠΎΠ²ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ, ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΈ ΠΎΡΠΈΡΠ°Π΅ΠΌ Π²Π΅ΠΊΡΠΎΡ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠΉ, Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ QAbstractItemModel::reset(), ΡΡΠΎΠ±Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠΈΡΡ Π²ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ Π²ΠΈΠ΄ΠΈΠΌΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ².