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

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

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

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(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚ΡŒ всС прСдставлСния ΠΎ нСобходимости обновлСния всСх Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ… элСмСнтов.