Читаем QT 4: программирование GUI на С++ полностью

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.

Создание представлений и кнопок, их компоновка и соединения сигнал—слот не содержат ничего особенного, поэтому из оставшейся части конструктора мы покажем только несколько не совсем очевидных соединений.

30 …

31 connect(cdTableView->selectionModel,

32 SIGNAL(currentRowChanged(const QModelIndex &,

33 const QModelIndex &)),

34 this, SLOT(currentCdChanged(const QModelIndex &)));

35 connect(cdModel, SIGNAL(beforeInsert(QSqlRecord &)),

36 this, SLOT(beforeInsertCd(QSqlRecord &)));

37 connect(trackModel, SIGNAL(beforeInsert(QSqlRecord &)),

38 this, SLOT(beforeInsertTrack(QSqlRecord &)));

39 connect(trackModel, SIGNAL(rowsInserted(

40 const QModelIndex &, int, int)),

41 this, SLOT(refreshTrackViewHeader));

42 …

43 }

Первое соединение необычно, поскольку вместо связывания виджета мы связываем модель выборки. Класс QItemSelectionModel используется для отслеживания выборок в представлениях. Связанный с моделью выборки представления таблицы, наш слот currentCdChanged будет вызываться при всяком перемещении пользователя от одной записи к другой.

01 void MainForm::currentCdChanged(const QModelIndex &index)

02 {

03 if (index.isValid) {

04 QSqlRecord record = cdModel->record(index.row);

05 int id = record.value("id").toInt;

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже