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 }
26 query.exec(QString("DELETE FROM track WHERE cdid = %1")
27 .arg(id));
28 }
29 cdModel->removeRow(index.row());
30 cdModel->submitAll();
31 db.commit();
32 currentCdChanged(QModelIndex());
33 }
Когда пользователь нажимает клавишу Delete CD (удалить компакт-диск), вызывается этот слот. Если имеется текущий компакт-диск, мы определяем, сколько у него дорожек. Если нет ни одной дорожки, мы просто удаляем запись компакт-диска. Если имеется по крайней мере одна дорожка, мы просим пользователя подтвердить удаление, и, если он нажимает кнопку Yes, мы удаляем все дорожки и затем запись самого компакт-диска. Все это делается в рамках транзакции, поэтому каскадное удаление либо совсем не будет выполнено, либо выполнится полностью при условии, что ваша база данных поддерживает транзакции.
Обработка данных дорожки очень похожа на обработку данных компакт-диска. Для обновления данных пользователь может просто редактировать ячейки. Что касается длительностей дорожек, то класс
01 void MainForm::addTrack()
02 {
03 if (!cdTableView->currentIndex().isValid())
04 return;
05 int row = 0;
06 if (trackTableView->currentIndex().isValid())
07 row = trackTableView->currentIndex().row();
08 trackModel->insertRow(row);
09 QModelIndex index = trackModel->index(row, Track_Title);
10 trackTableView->setCurrentIndex(index);
11 trackTableView->edit(index);
12 }
Эта функция работает так же, как
01 void MainForm::beforeInsertTrack(QSqlRecord &record)
02 {
03 QSqlRecord cdRecord = cdModel->record(cdTableView->currentIndex().row());
04 record.setValue("id", generateId("track"));
05 record.setValue("cdid", cdRecord.value(Cd_Id).toInt());
06 }
Если пользователь подтверждает вставку, инициированную функцией
01 void MainForm::deleteTrack()
02 {
03 trackModel->removeRow(trackTableView->currentIndex().row());
04 if (trackModel->rowCount() == 0)
05 trackTableView->horizontalHeader()->setVisible(false);
06 }