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

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

Жанры

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

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

Барон играет по своим правилам

Ренгач Евгений
5. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Барон играет по своим правилам

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Герцогиня в ссылке

Нова Юлия
2. Магия стихий
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Герцогиня в ссылке

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Истинная поневоле, или Сирота в Академии Драконов

Найт Алекс
3. Академия Драконов, или Девушки с секретом
Любовные романы:
любовно-фантастические романы
6.37
рейтинг книги
Истинная поневоле, или Сирота в Академии Драконов

Кодекс Охотника. Книга VI

Винокуров Юрий
6. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VI

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Душелов. Том 3

Faded Emory
3. Внутренние демоны
Фантастика:
альтернативная история
аниме
фэнтези
ранобэ
хентай
5.00
рейтинг книги
Душелов. Том 3

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Стеллар. Заклинатель

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5