Классы SQL-моделей для Интервью


Модуль QtSql поддерживает концепцию Интервью, предоставляя целый ряд моделей для использования их в представлениях. Класс QSqlTableModel позволяет, например, отображать данные в табличной и иерархической форме.

Использование Интервью — это самый простой способ отобразить данные таблицы. Здесь не потребуется цикла для прохождения по строкам таблицы.

Программа, окно которой отображено на рисунке, демонстрирует такую возможность.

{рисунок}


int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    if (!createConnection()) {
        return -1;
    }

    QTableView     view;
    QSqlTableModel model;

    model.setTable("addressbook");
    model.select();
    model.setEditStrategy(QSqlTableModel::OnFieldChange);
    
    view.setModel(&model);
    view.show();
    
    return app.exec();
}

После соединения с базой данных, проводимого с помощью функции createConnection(), создается объект табличного представления QTableView и объект табличной модели QSqlTableModel. Вызовом метода setTable() мы устанавливаем актуальную базу в модели. Вызов метода select() производит заполнение данными.

Теперь настало время немного рассказать о возможностях редактирования и записи данных. Класс QSqlTableModel предоставляет для этого три следующие стратегии редактирования, которые устанавливаются с помощью метода setEditStrategy():

  • onRowChange — производит запись данных, как только пользователь перейдет к другой строке таблицы;
  • onFieldChange — производит запись данных после того, как пользователь перейдет к другой ячейке таблицы;
  • OnManualSubmit —записывает данные по вызову слота submitAl(). Если вызывается слот revertAll(), то данные возвращаются в исходное состояние.

Какая из стратегий вам больше подходит, должны выбрать вы сами. В примере мы используем, вызовом метода setEditStrategy(), стратегию QSqlTableModel::OnFieldChange. Теперь данные нашей модели можно изменять после двойного щелчка на ячейке. В завершение мы устанавливаем модель в представлении вызовом метода setModel().

Если вам понадобится произвести отображение данных какого-либо конкретного опроса SELECT, то для этого целесообразнее будет воспользоваться другим классом SQL-моделей — классом QSqlQueryModel. Листинг ниже иллюстрирует отображение только электронных адресов и телефонных номеров всех контактов с именем Piggy. В нашем случае он будет всего лишь один.


int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    if (!createConnection()) {
        return -1;
    }

    QTableView     view;
    QSqlQueryModel model;
    model.setQuery("SELECT phone, email "
                   "FROM addressbook "
                   "WHERE name = 'Piggy';"
                  );

    if (model.lastError().isValid()) {
        qDebug() << model.lastError();
    }
      
    view.setModel(&model);
    view.show();
    
    return app.exec();
}

Здесь мы создаем табличное представление QTableView и модель опроса QSqlQueryModel. Строка запроса передается в метод setQuery(), после чего результат выполнения запроса проверяется в операторе if на наличие проблем исполнения, с помощью метода lastError(). Неверный объект класса QSqlError, возвращаемый этим методом, означает, что ошибок нет и никаких проблем не произошло. Это проверяется методом isValid(). Возникновение проблем повлечет их отображение в qDebug(). В завершение, модель устанавливается в представлении вызовом метода setModel().

Читать далее: Программирование поддержки сети в Qt