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

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, мы удаляем все дорожки и затем запись самого компакт-диска. Все это делается в рамках транзакции, поэтому каскадное удаление либо совсем не будет выполнено, либо выполнится полностью при условии, что ваша база данных поддерживает транзакции.

Обработка данных дорожки очень похожа на обработку данных компакт-диска. Для обновления данных пользователь может просто редактировать ячейки. Что касается длительностей дорожек, то класс TrackDelegate гарантирует удобный формат отображения времен и они легко могут редактироваться с использованием QTimeEdit.

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 }

Эта функция работает так же, как addCd, со вставкой в представление новой пустой строки.

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 }

Если пользователь подтверждает вставку, инициированную функцией addTrack, указанная выше функция вызывается для заполнения полей id и cdid. Упомянутые ранее предостережения применимы, конечно, и в этом случае.

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 }

Слот refreshTrackViewHeader вызывается из различных мест; он гарантирует вывод на экран горизонтального заголовка в представлении дорожек только в случае наличия дорожек. Он не показывает поля идентификаторов id и cdid и изменяет видимые размеры столбцов таблицы в зависимости от текущего содержимого таблицы.

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 }

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