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

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

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

НиТС приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования QSqlTableModel для выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SELECT:

QSqlTableModel model;

model.setTable("cd");

model.setFilter("year >= 1998");

model.select();

Π­Ρ‚ΠΎ эквивалСнтно запросу

SELECT * FROM cd WHERE year >= 1998

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π½Π°Π±ΠΎΡ€Π° выполняСтся ΠΏΡƒΡ‚Π΅ΠΌ получСния Π·Π°Π΄Π°Π½Π½ΠΎΠΉ записи Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ QSqlTableModel::record() ΠΈ доступа ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ полям с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ value():

for (int i = 0; i < model.rowCount(); ++i) {

QSqlRecord record = model.record(i);

QString title = record.value("title").toString();

int year = record.value("year").toInt();

cerr << qPrintable(title) << ": " << year << endl;

}

Ѐункция QSqlRecord::value() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π»ΠΈΠ±ΠΎ имя поля, Π»ΠΈΠ±ΠΎ индСкс поля. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с большими Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… рСкомСндуСтся Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ поля с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΡ… индСксов. НапримСр:

int titleIndex = model.record().indexOf("title");

int yearIndex = model.record().indexOf("year");

for (int i = 0; i < model.rowCount(); ++i) {

QSqlRecord record = model.record(i);

QString title = record.value(titleIndex).toString();

int year = record.value(yearIndex).toInt();

cerr << qPrintable(title) << ": " << year << endl;

}

Для вставки записи Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ дСйствуСм Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ Π΄Π΅Π»Π°Π»ΠΈ вставку Π² Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΡƒΡŽ модСль: сначала Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ insertRow() для создания Π½ΠΎΠ²ΠΎΠΉ пустой строки (записи) ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ setData() для установки значСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ столбца (поля записи).

QSqlTableModel model;

model.setTable("cd");

int row = 0;

model.insertRows(row, 1);

model.setData(model.index(row, 0), 113);

model.setData(model.index(row, 1), "Shanghai My Heart");

model.setData(model.index(row, 2), 224);

model.setData(model.index(row, 3), 2003);

model.submitAll();

ПослС Π²Ρ‹Π·ΠΎΠ²Π° submitAll() запись ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½Π° Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Π·Π°Π²ΠΈΡΡΡ‰ΡƒΡŽ ΠΎΡ‚ упорядочСнности Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Π’Ρ‹Π·ΠΎΠ² submitAll() Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ false, Ссли вставка окаТСтся Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΉ.

Π’Π°ΠΆΠ½Ρ‹ΠΌ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ΠΌ ΠΌΠΎΠ΄Π΅Π»ΠΈ SQL ΠΎΡ‚ стандартной ΠΌΠΎΠ΄Π΅Π»ΠΈ являСтся Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Π° Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ SQL Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ submitAll() для записи всСх ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…

Для обновлСния записи ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ сначала ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ QSqlTableModel Π½Π° запись, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select()). Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ запись, обновляСм ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ поля ΠΈ записываСм наши измСнСния ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…:

QSqlTableModel model;

model.setTable("cd");

model.setFilter("id = 125");

model.select();

if (model.rowCount() == 1) {

QSqlRecord record = model.record(0);

record.setValue("title", "Melody A.M.");

record.setValue("year", record.value("year").toInt() + 1);

model.setRecord(0, record);

model.submitAll();

}

Если имССтся запись, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰Π°Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρƒ, доступ ΠΊ Π½Π΅ΠΉ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QSqlTableModel::record(). ΠœΡ‹ осущСствляСм наши измСнСния ΠΈ вновь записываСм Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… запись с Π½ΠΎΠ²Ρ‹ΠΌΠΈ значСниями ΠΏΠΎΠ»Π΅ΠΉ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setData(), ΠΊΠ°ΠΊ это дСлаСтся для ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΎΡ‚ SQLβ€”ΠΌΠΎΠ΄Π΅Π»ΠΈ. Для получСния доступа ΠΊ полям записи ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ индСксы ΠΌΠΎΠ΄Π΅Π»ΠΈ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π½ΠΎΠΌΠ΅Ρ€Π° строки (записи) ΠΈ столбца (поля):

model.select();

if (model.rowCount() == 1) {

model.setData(model.index(0, 1), "Melody A.M.");

model.setData(model.index(0, 3),

model.data(model.index(0, 3)).toInt() + 1);

model.submitAll();

}

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ записи Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Π΅Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅:

model.setTable("cd");

model.setFilter("id = 125");

model.select();

if (model.rowCount() == 1) {

model.removeRows(0, 1);

model.submitAll();

}

Π’ Π²Ρ‹Π·ΠΎΠ²Π΅ removeRows() ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½ΠΎΠΌΠ΅Ρ€ строки ΠΏΠ΅Ρ€Π²ΠΎΠΉ удаляСмой записи ΠΈ количСство удаляСмых записСй. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ всС записи, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρƒ:

model.setTable("cd");

model.setFilter("year < 1990");

model.select();

if (model.rowCount() > 0) {

model.removeRows(0, model.rowCount());

model.submitAll();

}

ΠšΠ»Π°ΡΡΡ‹ QSqlQuery ΠΈ QSqlTableModel ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ интСрфСйс ΠΌΠ΅ΠΆΠ΄Ρƒ Qt ΠΈ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… SQL. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эти классы, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡ‹, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΈΠΌ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ, ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ записи.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅

Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС являСтся самым простым прСдставлСниСм Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π’ этом ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… ΠΌΡ‹ рассмотрим простоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ CD Collection (ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисков), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ модСль QSqlTableModel ΠΈ Π΅Π΅ подкласс QSqlRelationalTableModel ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для просмотра ΠΈ взаимодСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹ΠΌΠΈ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

Главная Ρ„ΠΎΡ€ΠΌΠ° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ прСдставлСниС Β«masterβ€”detailΒ» для ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисков ΠΈ Π΄ΠΎΡ€ΠΎΠΆΠ΅ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-диска (рис. 13.1).

Рис. 13.1. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ CD Collection.

Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

CREATE TABLE artist (

id INTEGER PRIMARY KEY,

name VARCHAR(40) NOT NULL,

country VARCHAR(40));

CREATE TABLE cd (

id INTEGER PRIMARY KEY,

title VARCHAR(40) NOT NULL,

artistid INTEGER NOT NULL,

year INTEGER N0T NULL,

FOREIGN KEY (artistid) REFERENCES artist);

CREATE TABLE track (

id INTEGER PRIMARY KEY,

title VARCHAR(40) NOT NULL,

duration INTEGER NOT NULL,

cdid INTEGER NOT NULL,

FOREIGN KEY (cdid) REFERENCES cd);

НСкоторыС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ внСшниС ΠΊΠ»ΡŽΡ‡ΠΈ. Π’ этом случаС ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Ρ„Ρ€Π°Π·Ρ‹ FOREIGN KEY. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ всС-Ρ‚Π°ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ссылок.

Рис. 13.2. Π’Π°Π±Π»ΠΈΡ†Ρ‹ прилоТСния CD Collection.

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ создадим Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ список артистов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ, ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ артистов ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ Ρ„ΠΎΡ€ΠΌΡ‹. ОбновлСния ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, просто рСдактируя тСкст ячССк. ИзмСнСния вносятся Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ Enter ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ запись.

Рис. 13.3. Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ArtistForm.

НиТС приводится ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса для Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ArtistForm:

01 class ArtistForm : public QDialog

02 {

03 Q_OBJECT

04 public:

05 ArtistForm(const QString &name, QWidget *parent = 0);

06 private slots:

07 void addArtist();

08 void deleteArtist();

09 void beforeInsertArtist(QSqlRecord &record);

10 private:

11 enum {

12 Artist_Id = 0,

13 Artist_Name = 1,

14 Artist_Country = 2

15 };

16 QSqlTableModel *model;

17 QTableView *tableView;

18 QPushButton *addButton;

19 QPushButton *deleteButton;

20 QPushButton *closeButton;

21 };

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ этого класса ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° конструктор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ использовался Π±Ρ‹ для создания Ρ„ΠΎΡ€ΠΌΡ‹, построСнной для ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΎΡ‚ SQLβ€”ΠΌΠΎΠ΄Π΅Π»ΠΈ:

01 ArtistForm::ArtistForm(const QString &name, QWidget *parent)

02 : QDialog(parent)

03 {

04 model = new QSqlTableModel(this);

05 model->setTable("artist");

06 model->setSort(Artist_Name, Qt::AscendingOrder);

07 model->setHeaderData(Artist_Name, Qt::Horizontal, tr("Name"));

08 model->setHeaderData(Artist_Country, Qt::Horizontal, tr("Country"));

09 model->select();

10 connect(model, SIGNAL(beforeInsert(QSqlRecord &)),

11 this, SLOT(beforeInsertArtist(QSqlRecord &)));

12 tableView = new QTableView;

13 tableView->setModel(model);

14 tableView->setColumnHidden(Artist_Id, true);

15 tableView->setSelectionBehavior(QAbstractItemView::SelectRows);

16 tableView->resizeColumnsToContents();

17 for (int row = 0; row < model->rowCount(); ++row) {

18 QSqlRecord record = model->record(row);

19 if (record.value(Artist_Name).toString() == name) {

20 tableView->selectRow(row);

21 break;

22 }

23 }

24 …

25 }

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ начинаСтся с создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QSqlTableModel. ΠœΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ this Π² качСствС родитСля, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»ΠΈ стала Ρ„ΠΎΡ€ΠΌΠ°. Нами Π²Ρ‹Π±Ρ€Π°Π½Π° сортировка ΠΏΠΎ столбцу 1 (задаСтся константой Artist_Name), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ соотвСтствуСт полю ΠΈΠΌΠ΅Π½ΠΈ. Если Π±Ρ‹ ΠΌΡ‹ Π½Π΅ Π·Π°Π΄Π°Π»ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ столбцов, Ρ‚ΠΎ использовались Π±Ρ‹ ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠ»Π΅ΠΉ. ΠœΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΈΡ… ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ рСгистр ΠΈ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.

Π—Π°Ρ‚Π΅ΠΌ создаСтся QTableView для Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ отобраТСния ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠœΡ‹ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎΠ»Π΅ id ΠΈ устанавливаСм Ρ‚Π°ΠΊΡƒΡŽ ΡˆΠΈΡ€ΠΈΠ½Ρƒ столбцов, которая Π±ΡƒΠ΄Π΅Ρ‚ достаточна для размСщСния Π² Π½ΠΈΡ… тСкста Π±Π΅Π· нСобходимости Π²Ρ‹Π²ΠΎΠ΄Π° многоточия.

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