Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

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

Шрифт:

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 указывает любому представлению, что все данные в используемой модели недействительны; это вынуждает их запросить свежие данные для тех элементов, которые видны на экране.

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

Идеальный мир для Лекаря 26

Сапфир Олег
26. Лекарь
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 26

Я уже князь. Книга XIX

Дрейк Сириус
19. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я уже князь. Книга XIX

Камень. Книга восьмая

Минин Станислав
8. Камень
Фантастика:
фэнтези
боевая фантастика
7.00
рейтинг книги
Камень. Книга восьмая

Тринадцатый IV

NikL
4. Видящий смерть
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Тринадцатый IV

На границе империй. Том 10. Часть 1

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Сирота

Шмаков Алексей Семенович
1. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Сирота

Земля под ногами. Из истории заселения и освоения Эрец Исраэль. 1918-1948. Книга 2

Кандель Феликс Соломонович
Научно-образовательная:
история
5.00
рейтинг книги
Земля под ногами. Из истории заселения и освоения Эрец Исраэль. 1918-1948. Книга 2

Слезы Эйдена 1

Владимиров Денис
11. Глэрд
Фантастика:
боевая фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Слезы Эйдена 1

На границе империй. Том 4

INDIGO
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
На границе империй. Том 4

Бастард Императора. Том 13

Орлов Андрей Юрьевич
13. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 13

Черный Маг Императора 13

Герда Александр
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 13

Дважды одаренный

Тарс Элиан
1. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Дважды одаренный

Форма жизни

Драу Михаэль
Фантастика:
боевая фантастика
киберпанк
7.62
рейтинг книги
Форма жизни

Камень. Книга пятая

Минин Станислав
5. Камень
Фантастика:
боевая фантастика
6.43
рейтинг книги
Камень. Книга пятая