Вход/Регистрация
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, и после этого новая запись вставляется в базу данных.

  • Читать дальше
  • 1
  • ...
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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