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 }
Если пользователь нажимает кнопку Delete Track (удалить дорожку), мы сразу же удаляем дорожку. Если предпочтительнее подтверждать удаление, мы могли бы легко выдать окно с сообщением и кнопками Yes и No.
01 void MainForm::refreshTrackViewHeader
02 {
03 trackTableView->horizontalHeader->setVisible(
04 trackModel->rowCount > 0);
05 trackTableView->setColumnHidden(Track_Id, true);
06 trackTableView->setColumnHidden(Track_CdId, true);
07 trackTableView-> resizeColumnsToContents;
08 }
Слот
01 void MainForm::editArtists
02 {
03 QSqlRecord record = cdModel->record(cdTableView->currentIndex.row);
04 ArtistForm artistForm(record.value(Cd_ArtistId).toString, this);
05 artistForm.exec;
06 cdModel->select;
07 }