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

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

Шрифт:

29 QSqlRelationalTableModel *cdModel;

30 QSqlTableModel *trackModel;

31 QTableView *cdTableView;

32 QTableView *trackTableView;

33 QPushButton *addCdButton;

34 QPushButton *deleteCdButton;

35 QPushButton *addTrackButton;

36 QPushButton *deleteTrackButton;

37 QPushButton *editArtistsButton;

38 QPushButton *quitButton;

39 };

Мы используем для таблицы компакт-дисков cd модель QSqlRelationalTableModel, а не простую модель QSqlTableModel, потому что нам придется работать с внешними ключами. Мы рассмотрим по очереди все функции, начиная с конструктора, который мы разобьем на несколько секций из-за его большого размера.

01 MainForm::MainForm

02 {

03 cdModel = new QSqlRelationalTableModel(this);

04 cdModel->setTable("cd");

05 cdModel->setRelation(Cd_ArtistId,

06 QSqlRelation("artist", "id", "name"));

07 cdModel->setSort(Cd_Title, Qt::AscendingOrder);

08 cdModel->setHeaderData(Cd_Title, Qt::Horizontal, tr("Title"));

09 cdModel->setHeaderData(Cd_ArtistId, Qt::Horizontal, tr("Artist"));

10 cdModel->setHeaderData(Cd_Year, Qt::Horizontal, tr("Year"));

11 cdModel->select;

Конструктор начинается с настройки модели QSqlRelationalTableModel, которая управляет таблицей cd. Вызов setRelation указывает модели на то, что ее поле artistid (индекс которого находится в переменной Cd_ArtistId) содержит идентификатор id внешнего ключа из таблицы артистов artist и что вместо идентификаторов необходимо выводить на экран содержимое соответствующего поля name. Если пользователь переходит в режим редактирования этого поля (например, нажимая клавишу F2), модель автоматически выведет на экран поле с выпадающим списком имен всех артистов, и если пользователь выбирает другого артиста, таблица cd будет обновлена.

12 cdTableView = new QTableView;

13 cdTableView->setModel(cdModel);

14 cdTableView->setItemDelegate(new QSqlRelationalDelegate(this));

15 cdTableView->setSelectionMode(QAbstractItemView::SingleSelection);

16 cdTableView->setSelectionBehavior(QAbstractItemView::SelectRows);

17 cdTableView->setColumnHidden(Cd_Id, true);

18 cdTableView->resizeColumnsToContents;

Настройка представления таблицы cd выполняется аналогично тому, что мы уже делали. Единственным существенным отличием является применение QSqlRelationalDelegate вместо делегата по умолчанию. Именно этот делегат обеспечивает работу с внешними ключами.

19 trackModel = new QSqlTableModel(this);

20 trackModel->setTable("track");

21 trackModel->setHeaderData(Track_Title, Qt::Horizontal, tr("Title"));

22 trackModel->setHeaderData(Track_Duration, Qt::Horizontal,

23 tr("Duration"));

24 trackTableView = new QTableView;

25 trackTableView->setModel(trackModel);

26 trackTableView->setItemDelegate(

27 new TrackDelegate(Track_Duration, this));

28 trackTableView->setSelectionMode(QAbstractItemView::SingleSelection);

29 trackTableView->setSelectionBehavior(QAbstractItemView::SelectRows);

Для дорожек мы собираемся выводить на экран только названия песен и их длительности, поэтому достаточно использовать модель QSqlTableModel. (Поля id и cdid, используемые в рассмотренном ниже слоте currentCdChanged, не выводятся на экран.) Единственно, на что следует обратить внимание в этой части программного кода, — это использование разработанного в главе 10 класса TrackDelegate, показывающего времена дорожек в виде «минуты:секунды» и позволяющего их редактировать с помощью удобного класса QTimeEdit.

  • Читать дальше
  • 1
  • ...
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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