06 trackModel->setFilter(QString("cdid = %1").arg(id));
07 } else {
08 trackModel->setFilter("cdid = -1");
09 }
10 trackModel->select;
11 refreshTrackViewHeader;
12 }
Этот слот вызывается при каждой смене текущего компакт-диска. Это происходит при переходе пользователя к другому компакт-диску (щелкая мышкой по соответствующей строке или используя клавиши Up и Down). Если компакт-диск недействителен (например, если вообще нет компакт-дисков или был вставлен новый компакт-диск, или текущий компакт-диск был только что удален), мы устанавливаем идентификатор
Затем, установив фильтр, мы выбираем ему соответствующие записи дорожек. Функция
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 (добавить компакт-диск), в таблицу
01 void MainForm::beforeInsertCd(QSqlRecord &record)
02 {
03 record.setValue("id", generateId("cd"));
04 }
Этот слот вызывается, когда
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 }