37 connect(trackModel, SIGNAL(beforeInsert(QSqlRecord &)),
38 this, SLOT(beforeInsertTrack(QSqlRecord &)));
39 connect(trackModel, SIGNAL(rowsInserted(
40 const QModelIndex &, int, int)),
41 this, SLOT(refreshTrackViewHeader()));
42 …
43 }
Первое соединение необычно, поскольку вместо связывания виджета мы связываем модель выборки. Класс
01 void MainForm::currentCdChanged(const QModelIndex &index)
02 {
03 if (index.isValid()) {
04 QSqlRecord record = cdModel->record(index.row());
05 int id = record.value("id").toInt();
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();