Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 78

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

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.