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

06 trackModel->setFilter(QString("cdid = %1").arg(id));

07 } else {

08 trackModel->setFilter("cdid = -1");

09 }

10 trackModel->select;

11 refreshTrackViewHeader;

12 }

Этот слот вызывается при каждой смене текущего компакт-диска. Это происходит при переходе пользователя к другому компакт-диску (щелкая мышкой по соответствующей строке или используя клавиши Up и Down). Если компакт-диск недействителен (например, если вообще нет компакт-дисков или был вставлен новый компакт-диск, или текущий компакт-диск был только что удален), мы устанавливаем идентификатор cdid таблицы дорожек track в значение —1 (недействительный идентификатор, которому не соответствует никакая запись).

Затем, установив фильтр, мы выбираем ему соответствующие записи дорожек. Функция refreshTrackViewHeader будет рассмотрена вскоре.

01 void MainForm::addCd

02 {

03 int row = 0;

04 if (cdTableView->currentIndex.isValid)

05 row = cdTableView->currentIndex.row;

06 cdModel->insertRow(row);

07 cdModel->setData(cdModel->index(row, Cd_Year),

08 QDate::currentDate.year);

09 QModelIndex index = cdModel->index(row, Cd_Title);

10 cdTableView->setCurrentIndex(index);

11 cdTableView->edit(index);

12 }

Когда пользователь нажимает клавишу Add CD (добавить компакт-диск), в таблицу cdTableView вставляется новая пустая строка и мы переходим в режим редактирования. Мы также устанавливаем значение по умолчанию для поля year. В этот момент пользователь может редактировать запись, заполняя пустые поля и выбирая артиста из выпадающего списка, который автоматически выдается моделью QSqlRelationalTableModel благодаря вызову setRelation, a также изменяя год, если не подходит значение по умолчанию. Если пользователь подтверждает вставку нажатием клавиши Enter, запись вставляется. Пользователь может отменить вставку, нажав клавишу Esc.

01 void MainForm::beforeInsertCd(QSqlRecord &record)

02 {

03 record.setValue("id", generateId("cd"));

04 }

Этот слот вызывается, когда cdModel генерирует свой сигнал beforeInsert. Мы используем его для заполнения поля id, как это делалось при вставке нового артиста, и здесь применимо то же самое предостережение: данная операция должна выполняться в рамках транзакции, а в идеальном случае должно использоваться зависимое от базы данных средство создания идентификаторов (например, автоматическая генерация идентификаторов).

01 void MainForm::deleteCd

02 {

03 QModelIndex index = cdTableView->currentIndex;

04 if (!index.isValid)

05 return;

06 QSqlDatabase db = QSqlDatabase::database;

07 db.transaction;

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

09 int id = record.value(Cd_Id).toInt;

10 int tracks = 0;

11 QSqlQuery query;

12 query.exec(QString("SELECT COUNT(*) FROM track WHERE cdid = %1")

13 .arg(id));

14 if (query.next)

15 tracks = query.value(0).tolnt;

16 if (tracks > 0) {

17 int r = QMessageBox::question(this, tr("Delete CD"),

18 tr("Delete \"%1\" and all its tracks?")

19 .arg(record.value(Cd_ArtistId).toString),

20 QMessageBox::Yes | QMessageBox::Default,

21 QMessageBox::No | QMessageBox::Escape);

22 if (r == QMessageBox::No) {

23 db.rollback;

24 return;

25 }

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