35 connect(cdModel, SIGNAL(beforeInsert(QSqlRecord &)),
36 this, SLOT(beforeInsertCd(QSqlRecord &)));
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 }
ΠΠ΅ΡΠ²ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±ΡΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ° ΠΌΡ ΡΠ²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ Π²ΡΠ±ΠΎΡΠΊΠΈ. ΠΠ»Π°ΡΡ QItemSelectionModel ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ Π²ΡΠ±ΠΎΡΠΎΠΊ Π² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡΡ . Π‘Π²ΡΠ·Π°Π½Π½ΡΠΉ Ρ ΠΌΠΎΠ΄Π΅Π»ΡΡ Π²ΡΠ±ΠΎΡΠΊΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΈΡΡ, Π½Π°Ρ ΡΠ»ΠΎΡ currentCdChanged() Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΏΡΠΈ Π²ΡΡΠΊΠΎΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎΡ ΠΎΠ΄Π½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ ΠΊ Π΄ΡΡΠ³ΠΎΠΉ.
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). ΠΡΠ»ΠΈ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π΅Π½ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅Ρ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠΎΠ² ΠΈΠ»ΠΈ Π±ΡΠ» Π²ΡΡΠ°Π²Π»Π΅Π½ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊ, ΠΈΠ»ΠΈ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊ Π±ΡΠ» ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠ΄Π°Π»Π΅Π½), ΠΌΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ cdid ΡΠ°Π±Π»ΠΈΡΡ Π΄ΠΎΡΠΎΠΆΠ΅ΠΊ track Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ β1 (Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π½Π΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠ°Ρ Π·Π°ΠΏΠΈΡΡ).
ΠΠ°ΡΠ΅ΠΌ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ² ΡΠΈΠ»ΡΡΡ, ΠΌΡ Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ Π΅ΠΌΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ Π·Π°ΠΏΠΈΡΠΈ Π΄ΠΎΡΠΎΠΆΠ΅ΠΊ. Π€ΡΠ½ΠΊΡΠΈΡ refreshTrackViewHeader() Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π° Π²ΡΠΊΠΎΡΠ΅.
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 (Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊ), Π² ΡΠ°Π±Π»ΠΈΡΡ cdTableView Π²ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π½ΠΎΠ²Π°Ρ ΠΏΡΡΡΠ°Ρ ΡΡΡΠΎΠΊΠ° ΠΈ ΠΌΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π² ΡΠ΅ΠΆΠΈΠΌ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΠ»Ρ year. Π ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π°ΠΏΠΈΡΡ, Π·Π°ΠΏΠΎΠ»Π½ΡΡ ΠΏΡΡΡΡΠ΅ ΠΏΠΎΠ»Ρ ΠΈ Π²ΡΠ±ΠΈΡΠ°Ρ Π°ΡΡΠΈΡΡΠ° ΠΈΠ· Π²ΡΠΏΠ°Π΄Π°ΡΡΠ΅Π³ΠΎ ΡΠΏΠΈΡΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΄Π°Π΅ΡΡΡ ΠΌΠΎΠ΄Π΅Π»ΡΡ QSqlRelationalTableModel Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π²ΡΠ·ΠΎΠ²Ρ setRelation(), a ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ Π³ΠΎΠ΄, Π΅ΡΠ»ΠΈ Π½Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ Π²ΡΡΠ°Π²ΠΊΡ Π½Π°ΠΆΠ°ΡΠΈΠ΅ΠΌ ΠΊΠ»Π°Π²ΠΈΡΠΈ Enter, Π·Π°ΠΏΠΈΡΡ Π²ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΌΠ΅Π½ΠΈΡΡ Π²ΡΡΠ°Π²ΠΊΡ, Π½Π°ΠΆΠ°Π² ΠΊΠ»Π°Π²ΠΈΡΡ Esc.
01 void MainForm::beforeInsertCd(QSqlRecord &record)
02 {
03 record.setValue("id", generateId("cd"));
04 }
ΠΡΠΎΡ ΡΠ»ΠΎΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° cdModel Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠ²ΠΎΠΉ ΡΠΈΠ³Π½Π°Π» beforeInsert(). ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΅Π³ΠΎ Π΄Π»Ρ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ»Ρ id, ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°Π»ΠΎΡΡ ΠΏΡΠΈ Π²ΡΡΠ°Π²ΠΊΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π°ΡΡΠΈΡΡΠ°, ΠΈ Π·Π΄Π΅ΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ΅ΡΠ΅ΠΆΠ΅Π½ΠΈΠ΅: Π΄Π°Π½Π½Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, Π° Π² ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΠ΅ ΠΎΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ²).
01 void MainForm::deleteCd()
02 {
03 QModelIndex index = cdTableView->currentIndex();
04 if (!index.isValid())
05 return;
06 QSqlDatabase db = QSqlDatabase::database();
07 db.transaction();
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, ΠΌΡ ΡΠ΄Π°Π»ΡΠ΅ΠΌ Π²ΡΠ΅ Π΄ΠΎΡΠΎΠΆΠΊΠΈ ΠΈ Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΠΈΡΡ ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ°. ΠΡΠ΅ ΡΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠ°ΡΠΊΠ°Π΄Π½ΠΎΠ΅ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π»ΠΈΠ±ΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΎ, Π»ΠΈΠ±ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠΈ, ΡΡΠΎ Π²Π°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ.
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π°Π½Π½ΡΡ Π΄ΠΎΡΠΎΠΆΠΊΠΈ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆΠ° Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π΄Π°Π½Π½ΡΡ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ°. ΠΠ»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΡΡΠΎ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ΅ΠΉΠΊΠΈ. Π§ΡΠΎ ΠΊΠ°ΡΠ°Π΅ΡΡΡ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠ΅ΠΉ Π΄ΠΎΡΠΎΠΆΠ΅ΠΊ, ΡΠΎ ΠΊΠ»Π°ΡΡ 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 }
ΠΡΠΎΡ ΡΠ»ΠΎΡ, Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ Edit Artists (ΠΏΡΠ°Π²ΠΊΠ° Π°ΡΡΠΈΡΡΠΎΠ²). ΠΠ½ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π²ΡΠ²ΠΎΠ΄ Π½Π° ΡΠΊΡΠ°Π½ Π΄Π°Π½Π½ΡΡ ΠΎ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ°Ρ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ Π°ΡΡΠΈΡΡΠ°, Π²ΡΠ·ΡΠ²Π°Ρ ΡΠΎΡΠΌΡ ArtistForm, ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΡ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅, ΠΈ Π΄Π΅Π»Π°Ρ Π²ΡΠ±ΠΎΡΠΊΡ ΠΏΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌΡ Π°ΡΡΠΈΡΡΡ. ΠΡΠ»ΠΈ Π½Π΅Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π·Π°ΠΏΠΈΡΠΈ, ΡΡΠ½ΠΊΡΠΈΡ record() Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡ Π±Π΅Π·Π²ΡΠ΅Π΄Π½ΡΡ ΠΏΡΡΡΡΡ Π·Π°ΠΏΠΈΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ (ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠ±ΡΠ°Π½Π°) Π½ΠΈΠΊΠ°ΠΊΠΎΠΌΡ Π°ΡΡΠΈΡΡΡ Π² ΡΠΎΡΠΌΠ΅ Π°ΡΡΠΈΡΡΠΎΠ². Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ record.value(Cd_ArtistId), ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΈΠ·-Π·Π° ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ QSqlRelationalTableModel, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°ΠΌ Π°ΡΡΠΈΡΡΠΎΠ² ΡΡΠ°Π²ΠΈΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΈΡ ΠΈΠΌΠ΅Π½Π°, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΈΠΌΡ Π°ΡΡΠΈΡΡΠ° (Π° ΠΎΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΡΡΡΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ, Π΅ΡΠ»ΠΈ Π·Π°ΠΏΠΈΡΡ ΠΏΡΡΡΠ°Ρ). Π ΠΊΠΎΠ½ΡΠ΅ ΠΌΡ ΡΠ½ΠΎΠ²Π° Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ cdModel, ΡΡΠΎ Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ cdTableView ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΡΠ²ΠΎΠΈ Π²ΠΈΠ΄ΠΈΠΌΡΠ΅ ΡΡΠ΅ΠΉΠΊΠΈ. ΠΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ Π²ΡΠ²ΠΎΠ΄ Π½Π° ΡΠΊΡΠ°Π½ ΠΈΠΌΠ΅Π½ Π°ΡΡΠΈΡΡΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠ³ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ ArtistForm.