Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

Саммерфилд Марк

Шрифт:

Для сравнения пользовательской модели с простой таблицей предположим, что у нас имеется три города: А, В и С. Для обеспечения всех сочетаний нам пришлось бы хранить девять значений. В аккуратно спроектированной модели потребовалось бы только три элемента: (А, В), (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 элемент для заданной строки и заданного столбца, возвращая расстояние для этой конкретной пары городов.

  • Читать дальше
  • 1
  • ...
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: