model.select();

if (model.rowCount() > 0) {

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

model.submitAll();

}

Классы QSqlQuery и QSqlTableModel обеспечивают интерфейс между Qt и базой данных SQL. Используя эти классы, можно создавать формы, представляющие данные пользователям и позволяющие им вставлять, обновлять и удалять записи.

<p>Представление данных в табличной форме</p>

Во многих случаях табличное представление является самым простым представлением набора данных для пользователей. В этом и последующих разделах мы рассмотрим простое приложение 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 &)),

Перейти на страницу:

Похожие книги