Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

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

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. Некоторые базы данных поддерживают средство автоматической генерации полей, и обычно значительно лучше использовать предусмотренные в базе данных специальные средства поддержки этой операции.

Поделиться:
Популярные книги

Последний Паладин

Саваровский Роман
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Евангелие от зверя

Головачев Василий Васильевич
Шедевры отечественной фантастики
Фантастика:
фэнтези
альтернативная история
4.57
рейтинг книги
Евангелие от зверя

Встреча

Видум Инди
7. Петя и Валерон
Фантастика:
рпг
аниме
попаданцы
5.00
рейтинг книги
Встреча

Я еще не царь

Дрейк Сириус
25. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я еще не царь

Первый среди равных. Книга VI

Бор Жорж
6. Первый среди Равных
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VI

Старый, но крепкий 8

Крынов Макс
8. Культивация без насилия
Фантастика:
рпг
уся
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Старый, но крепкий 8

Зодчий. Книга VI

Погуляй Юрий Александрович
6. Зодчий Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Зодчий. Книга VI

Последний Паладин. Том 6

Саваровский Роман
6. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 6

Последний Герой. Том 5

Дамиров Рафаэль
5. Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Герой. Том 5

Двойник Короля 2

Скабер Артемий
2. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля 2

Последний Паладин. Том 10

Саваровский Роман
10. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 10

Газлайтер. Том 27

Володин Григорий Григорьевич
27. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 27

Газлайтер. Том 3

Володин Григорий
3. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 3