Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

Саммерфилд Марк

Шрифт:

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

Обработка данных дорожки очень похожа на обработку данных компакт-диска. Для обновления данных пользователь может просто редактировать ячейки. Что касается длительностей дорожек, то класс 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 и изменяет видимые размеры столбцов таблицы в зависимости от текущего содержимого таблицы.

  • Читать дальше
  • 1
  • ...
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: