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

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

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

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ ArtistForm ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ имя артиста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Π½ ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π½Π° экран Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. ΠœΡ‹ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ записям Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ artist ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ этого артиста. ΠžΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° конструктора ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π½ΠΈΠΌ слотов, Π° Ρ‚Π°ΠΊΠΆΠ΅ для ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅.

01 void ArtistForm::addArtist()

02 {

03 int row = model->rowCount();

04 model->insertRow(row);

05 QModelIndex index = model->index(row, Artist_Name);

06 tableView->setCurrentIndex(index);

07 tableView->edit(index);

08 }

Для добавлСния Π½ΠΎΠ²ΠΎΠ³ΠΎ артиста ΠΌΡ‹ вставляСм ΠΎΠ΄Π½Ρƒ ΠΏΡƒΡΡ‚ΡƒΡŽ строку Π² ΠΊΠΎΠ½Π΅Ρ† Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ прСдставлСния QTableView. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ имя Π½ΠΎΠ²ΠΎΠ³ΠΎ артиста ΠΈ Π΅Π³ΠΎ страну. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚ вставку, наТимая ΠΊΠ½ΠΎΠΏΠΊΡƒ Enter, гСнСрируСтся сигнал beforeInsert(), ΠΈ послС этого новая запись вставляСтся Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ….

01 void ArtistForm::beforeInsertArtist(QSqlRecord &record)

02 {

03 record.setValue("id", generateId("artist"));

04 }

Π’ конструкторС ΠΌΡ‹ связываСм сигнал ΠΌΠΎΠ΄Π΅Π»ΠΈ beforeInsert() с этим слотом. ΠœΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π½Π΅ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΡƒΡŽ ссылку Π½Π° запись нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π΅ вставкой Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ устанавливаСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля id.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π°ΠΌ потрСбуСтся Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ generateId() нСсколько Ρ€Π°Π·, ΠΌΡ‹ опрСдСляСм Π΅Π΅ ΠΊΠ°ΠΊ inlineβ€”Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π΅Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости. НиТС даСтся простой (ΠΈ нСэффСктивный) способ Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

01 inline int generateId(const QString &table)

02 {

03 QSqlQuery query;

04 query.exec("SELECT MAX(id) FROM " + table);

05 int id = 0;

06 if (query.next())

07 id = query.value(0).tolnt() + 1;

08 return id;

09 }

Ѐункция generateId() ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Ссли ΠΎΠ½Π° выполняСтся Π² Ρ€Π°ΠΌΠΊΠ°Ρ… контСкста ΠΎΠ΄Π½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ INSERT. НСкоторыС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ срСдство автоматичСской Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»Π΅ΠΉ, ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прСдусмотрСнныС Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ срСдства ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ β€” это послСдняя опСрация, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ позволяСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ArtistForm. ВмСсто каскадного удалСния (вскорС Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСно) ΠΌΡ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ артистов Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π½Π΅Ρ‚ ΠΈΡ… ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисков.

01 void ArtistForm::deleteArtist()

02 {

03 tableView->setFocus();

04 QModelIndex index = tableView->currentIndex();

05 if (!index.isValid())

06 return;

07 QSqlRecord record = model->record(index.row());

08 QSqlTableModel cdModel;

09 cdModel.setTable("cd");

10 cdModel.setFilter("artistid = " + record.value("id").toString());

11 cdModel.select();

12 if (cdModel.rowCount() == 0) {

13 model->removeRow(tableView->currentIndex().row());

14 } else {

15 QMessageBox::information(this, tr("Delete Artist"),

16 tr("Cannot delete %1 because there are CDs associated "

17 "with this artist in the collection.")

18 .arg(record.value("name").toString()));

19 }

20 }

Если Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° какая-Ρ‚ΠΎ запись, ΠΌΡ‹ провСряСм Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисков Ρƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ артиста, ΠΈ Ссли ΠΎΠ½ΠΈ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚, ΠΌΡ‹ сразу ΠΆΠ΅ удаляСм эту запись артиста. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΌΡ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π½Π° экран ΠΎΠΊΠ½ΠΎ с сообщСниСм ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ нСвыполнСния удалСния. Π‘Ρ‚Ρ€ΠΎΠ³ΠΎ говоря, здСсь слСдовало Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ cdModel.select() ΠΈ model->removeRow() Ρƒ артиста ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ свой ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-диск. Вранзакция Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСна Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌ ΠΏΠΎ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Β«masterβ€”detailΒ»

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ рассмотрим Π³Π»Π°Π²Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ, которая Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Β«masterβ€”detailΒ». Π“Π»Π°Π²Π½Ρ‹ΠΉ Π²ΠΈΠ΄ прСдставляСт собой список ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисков. Π’ΠΈΠ΄ описания Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ прСдставляСт собой список Π΄ΠΎΡ€ΠΎΠΆΠ΅ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-диска. Π­Ρ‚ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ являСтся Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠΊΠ½ΠΎΠΌ прилоТСния CD Collection (ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисков); ΠΎΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 13.1.

01 class MainForm : public QWidget

02 {

03 Q_OBJECT

04 public:

05 MainForm();

06 private slots:

07 void addCd();

08 void deleteCd();

09 void addTrack();

10 void deleteTrack();

11 void editArtists();

12 void currentCdChanged(const QModelIndex &index);

13 void beforeInsertCd(QSqlRecord &record);

14 void beforeInsertTrack(QSqlRecord &record);

15 void refreshTrackViewHeader();

16 private:

17 enum {

18 Cd_Id = 0,

19 Cd_Title = 1,

20 Cd_ArtistId = 2,

21 Cd_Year = 3

22 };

23 enum {

24 Track_Id = 0,

25 Track_Title = 1,

26 Track_Duration = 2,

27 Track_CdId = 3

28 };

29 QSqlRelationalTableModel *cdModel;

30 QSqlTableModel *trackModel;

31 QTableView *cdTableView;

32 QTableView *trackTableView;

33 QPushButton *addCdButton;

34 QPushButton *deleteCdButton;

35 QPushButton *addTrackButton;

36 QPushButton *deleteTrackButton;

37 QPushButton *editArtistsButton;

38 QPushButton *quitButton;

39 };

ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ для Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисков cd модСль QSqlRelationalTableModel, Π° Π½Π΅ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ модСль QSqlTableModel, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ придСтся Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с внСшними ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ. ΠœΡ‹ рассмотрим ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, начиная с конструктора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±ΡŒΠ΅ΠΌ Π½Π° нСсколько сСкций ΠΈΠ·-Π·Π° Π΅Π³ΠΎ большого Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

01 MainForm::MainForm()

02 {

03 cdModel = new QSqlRelationalTableModel(this);

04 cdModel->setTable("cd");

05 cdModel->setRelation(Cd_ArtistId,

06 QSqlRelation("artist", "id", "name"));

07 cdModel->setSort(Cd_Title, Qt::AscendingOrder);

08 cdModel->setHeaderData(Cd_Title, Qt::Horizontal, tr("Title"));

09 cdModel->setHeaderData(Cd_ArtistId, Qt::Horizontal, tr("Artist"));

10 cdModel->setHeaderData(Cd_Year, Qt::Horizontal, tr("Year"));

11 cdModel->select();

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ начинаСтся с настройки ΠΌΠΎΠ΄Π΅Π»ΠΈ QSqlRelationalTableModel, которая управляСт Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ cd. Π’Ρ‹Π·ΠΎΠ² setRelation() ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΅Π΅ ΠΏΠΎΠ»Π΅ artistid (индСкс ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ находится Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Cd_ArtistId) содСрТит ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ id внСшнСго ΠΊΠ»ΡŽΡ‡Π° ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ артистов artist ΠΈ Ρ‡Ρ‚ΠΎ вмСсто ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° экран содСрТимоС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ поля name. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ€Π΅ΠΆΠΈΠΌ рСдактирования этого поля (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, наТимая ΠΊΠ»Π°Π²ΠΈΡˆΡƒ F2), модСль автоматичСски Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Π½Π° экран ΠΏΠΎΠ»Π΅ с Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΌ списком ΠΈΠΌΠ΅Π½ всСх артистов, ΠΈ Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ артиста, Ρ‚Π°Π±Π»ΠΈΡ†Π° cd Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π°.

12 cdTableView = new QTableView;

13 cdTableView->setModel(cdModel);

14 cdTableView->setItemDelegate(new QSqlRelationalDelegate(this));

15 cdTableView->setSelectionMode(QAbstractItemView::SingleSelection);

16 cdTableView->setSelectionBehavior(QAbstractItemView::SelectRows);

17 cdTableView->setColumnHidden(Cd_Id, true);

18 cdTableView->resizeColumnsToContents();

Настройка прСдставлСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ cd выполняСтся Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ Π΄Π΅Π»Π°Π»ΠΈ. ЕдинствСнным сущСствСнным ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ΠΌ являСтся ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ QSqlRelationalDelegate вмСсто Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ИмСнно этот Π΄Π΅Π»Π΅Π³Π°Ρ‚ обСспСчиваСт Ρ€Π°Π±ΠΎΡ‚Ρƒ с внСшними ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ.

19 trackModel = new QSqlTableModel(this);

20 trackModel->setTable("track");

21 trackModel->setHeaderData(Track_Title, Qt::Horizontal, tr("Title"));

22 trackModel->setHeaderData(Track_Duration, Qt::Horizontal,

23 tr("Duration"));

24 trackTableView = new QTableView;

25 trackTableView->setModel(trackModel);

26 trackTableView->setItemDelegate(

27 new TrackDelegate(Track_Duration, this));

28 trackTableView->setSelectionMode(QAbstractItemView::SingleSelection);

29 trackTableView->setSelectionBehavior(QAbstractItemView::SelectRows);

Для Π΄ΠΎΡ€ΠΎΠΆΠ΅ΠΊ ΠΌΡ‹ собираСмся Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° экран Ρ‚ΠΎΠ»ΡŒΠΊΠΎ названия пСсСн ΠΈ ΠΈΡ… Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, поэтому достаточно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ модСль QSqlTableModel. (Поля id ΠΈ cdid, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² рассмотрСнном Π½ΠΈΠΆΠ΅ слотС currentCdChanged(), Π½Π΅ выводятся Π½Π° экран.) ЕдинствСнно, Π½Π° Ρ‡Ρ‚ΠΎ слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π² этой части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, β€” это использованиС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ³ΠΎ Π² Π³Π»Π°Π²Π΅ 10 класса TrackDelegate, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π° Π΄ΠΎΡ€ΠΎΠΆΠ΅ΠΊ Π² Π²ΠΈΠ΄Π΅ Β«ΠΌΠΈΠ½ΡƒΡ‚Ρ‹:сСкунды» ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΈΡ… Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ класса QTimeEdit.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ прСдставлСний ΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° ΠΈ соСдинСния сигнал—слот Π½Π΅ содСрТат Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного, поэтому ΠΈΠ· ΠΎΡΡ‚Π°Π²ΡˆΠ΅ΠΉΡΡ части конструктора ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСсколько Π½Π΅ совсСм ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… соСдинСний.

30 …

31 connect(cdTableView->selectionModel(),

32 SIGNAL(currentRowChanged(const QModelIndex &,

33 const QModelIndex &)),

34 this, SLOT(currentCdChanged(const QModelIndex &)));