Подсказки на компьютерную тематику

Можно подсмотреть, если забыли…

Как создать работающий пример кода в Qt для работы с таблицами из локальной базы данных

Создание программы на QT, которая выводит данные из таблицы БД SQLite, а также их редактирует и вставляет

    Порядок создания программы, которая работает с таблицей БД:

  • создать проект Qt fortabledb.pro
  • в файле fortabledb.pro добавить код для работы с SQL QT += sql
  • в файле fortabledb.h в классе class MainWindow : public QMainWindow прописать новые функции:
  • private slots:
    void createTable();// это созданный нами слот для вывода БД при запуске
    void workingdbsave();// это созданный нами слот для сохранения изменений в БД
    void inserttodb();// это созданный нами слот для вставки данных в БД
  • файл main.cpp не изменять
  • в файл дизайнер формы mainwindow.ui добавить элементы:
  • widget class=”QTableView” name=”tableView”
  • widget class=”QPushButton” name=”pushButton” с надписью Сохранить изменения
  • widget class=”QPushButton” name=”pushButton_2″ с надписью Вставить
  • widget class=”QLineEdit” name=”lineEdit”
  • widget class=”QLineEdit” name=”lineEdit_2
  • widget class=”QLineEdit” name=”lineEdit_3″
  • widget class=”QLineEdit” name=”lineEdit_4″
  • в файл mainwindow.cpp добавить классы
  • #include "QSqlQuery"//для работы с SQL запросами
    #include "QTableView"//для работы с графическим выводом информации в виде таблиц
    #include "QSqlTableModel" //класс для работы с редактируемой одиночной таблицей из БД
    #include "QSqlRelationalTableModel" //класс для работы с редактируемой таблицей из БД с поддержкой внешних ключей
    #include "QSqlQueryModel" //класс для работы с таблицей только для чтения из БД для вывода SQL запросов
  • глобальные переменную и объекты классов, видимые внутри функций:
  • static QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// db - это внешняя глобальная переменная, которую можно использовать тво всех файлах программы
    QSqlTableModel *model = new QSqlTableModel; //создается глобальный объект модели таблицы с редактируемыми ячейками
    QSqlQueryModel *model1 = new QSqlQueryModel; //создается объект модели с таблицей только для чтения
  • в функции со значением ui->setupUi(this); сразу после этой строки добавить функцию, запускающуюся сразу при запуске программы и функции, срабатывающие после нажатия кнопок pushButton и pushButton_2
  • createTable();//запуск функции, выводящий базу данных сразу после запуска программы

    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(workingdbsave())); //для сохранения изменений в БД
    connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(inserttodb())); //для вставки данных в БД

  • в самом конце файла прописываем эти функции, работающие с базой данных SQLite:
  • //функция для сохранения изменений в БД
    void MainWindow::workingdbsave(){
    //подключить БД по ее адресу на компьютере
    db.setDatabaseName("/home/mishanyya/fordbwork/examplebdfordbwork");
    //открывает базу данных, указанную в db.setDatabaseName("/home/mishanyya/fordbwork/examplebdfordbwork");
    db.open();
    //этот метод работает при настройке setEditStrategy(QSqlTableModel::OnManualSubmit)
    model->submitAll();//сохранить все изменения в таблице
    }

    //функция для вставки значений в БД
    void MainWindow::inserttodb(){
    //подключить БД по ее адресу на компьютере
    db.setDatabaseName("/home/mishanyya/fordbwork/examplebdfordbwork");
    //открывает базу данных, указанную в db.setDatabaseName("/home/mishanyya/fordbwork/examplebdfordbwork");
    db.open();
    //ввод данных из полей в переменные
    QString vname=ui->lineEdit->text();
    QString vfone=ui->lineEdit_2->text();
    QString vautomodel=ui->lineEdit_3->text();
    QString vprice=ui->lineEdit_4->text();
    //создание объекта для запроса
    QSqlQuery query;
    //создание подготовленного запроса
    query.prepare("INSERT INTO basetable (name, fone,automodel,price) VALUES (:name, :fone,:automodel,:price)");
    //вставка знасений в запрос
    query.bindValue(":name", vname);
    query.bindValue(":fone", vfone);
    query.bindValue(":automodel", vautomodel);
    query.bindValue(":price", vprice);
    //исполнение SQL запроса
    query.exec();
    }

    //функция, которая должна выводить базу данных в таблице при запуске программы
    void MainWindow::createTable(){
    //Общий код для QSqlTableModel, QSqlRelationalTableModel и QSqlQueryModel:
    //подключить БД по ее адресу на компьютере
    db.setDatabaseName("/home/mishanyya/fordbwork/examplebdfordbwork");
    //открывает базу данных, указанную в db.setDatabaseName("/home/mishanyya/fordbwork/examplebdfordbwork");
    db.open();

    //Код для QSqlTableModel и QSqlRelationalTableModel - таблиц с редактируемыми ячейками
    //QSqlRelationalTableModel работает также как QSqlTableModel, но позволяет настройку внешних ключей с другими таблицами
    model->setTable("basetable");//выбирается существующая табл БД
    //Возможны значения для редактирования записей:
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);//настраивается редактирование таблицы
    //model->setEditStrategy(QSqlTableModel::OnFieldChange);//данные сохранятся в БД сразу при переходе на другую ячейку
    //model->setEditStrategy(QSqlTableModel::OnRowChange);//данные сохранятся в БД сразу при переходе на другую строку
    model->select();//заполняет модель данными из таблицы, без этого кода выйдет пустая таблица
    ui->tableView->setModel(model);//выводит в виде таблицы все элементы в окне приложения

    /*
    //Код для QSqlQueryModel - таблиц только для чтения информации через запросы SQL
    model1->setQuery("SELECT * FROM basetable");//в модель помещается результат SQL запроса к существующим в БД, таблице и полям
    ui->tableView->setModel(model1);//выводит в виде таблицы все элементы в окне приложения, не работает в функции main()
    */ }

  • В фунуции createTable указано сразу два различных части кода для работы с разными классами таблиц, во избежание ошибок одна из частей взята в комментарии /* и */. одна или другая часть кода должны быть всегда заккоментированы!

Как создать работающий пример кода в Qt для работы с таблицами из локальной базы данных

Создание программы на QT, которая выводит данные из таблицы БД SQLite, а также их редактирует и вставляет

    Порядок создания программы, которая работает с таблицей БД:

  • создать проект Qt fortabledb.pro
  • в файле fortabledb.pro добавить код для работы с SQL QT += sql
  • в файле fortabledb.h в классе class MainWindow : public QMainWindow прописать новые функции:
  • private slots:
    void createTable();// это созданный нами слот для вывода БД при запуске
    void workingdbsave();// это созданный нами слот для сохранения изменений в БД
    void inserttodb();// это созданный нами слот для вставки данных в БД
  • файл main.cpp не изменять
  • в файл дизайнер формы mainwindow.ui добавить элементы:
  • widget class=”QTableView” name=”tableView”
  • widget class=”QPushButton” name=”pushButton” с надписью Сохранить изменения
  • widget class=”QPushButton” name=”pushButton_2″ с надписью Вставить
  • widget class=”QLineEdit” name=”lineEdit”
  • widget class=”QLineEdit” name=”lineEdit_2
  • widget class=”QLineEdit” name=”lineEdit_3″
  • widget class=”QLineEdit” name=”lineEdit_4″
  • в файл mainwindow.cpp добавить классы
  • #include "QSqlQuery"//для работы с SQL запросами
    #include "QTableView"//для работы с графическим выводом информации в виде таблиц
    #include "QSqlTableModel" //класс для работы с редактируемой одиночной таблицей из БД
    #include "QSqlRelationalTableModel" //класс для работы с редактируемой таблицей из БД с поддержкой внешних ключей
    #include "QSqlQueryModel" //класс для работы с таблицей только для чтения из БД для вывода SQL запросов
  • глобальные переменную и объекты классов, видимые внутри функций:
  • static QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// db - это внешняя глобальная переменная, которую можно использовать тво всех файлах программы
    QSqlTableModel *model = new QSqlTableModel; //создается глобальный объект модели таблицы с редактируемыми ячейками
    QSqlQueryModel *model1 = new QSqlQueryModel; //создается объект модели с таблицей только для чтения
  • в функции со значением ui->setupUi(this); сразу после этой строки добавить функцию, запускающуюся сразу при запуске программы и функции, срабатывающие после нажатия кнопок pushButton и pushButton_2
  • createTable();//запуск функции, выводящий базу данных сразу после запуска программы

    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(workingdbsave())); //для сохранения изменений в БД
    connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(inserttodb())); //для вставки данных в БД

  • в самом конце файла прописываем эти функции, работающие с базой данных SQLite:
  • //функция для сохранения изменений в БД
    void MainWindow::workingdbsave(){
    //подключить БД по ее адресу на компьютере
    db.setDatabaseName("/home/mishanyya/fordbwork/examplebdfordbwork");
    //открывает базу данных, указанную в db.setDatabaseName("/home/mishanyya/fordbwork/examplebdfordbwork");
    db.open();
    //этот метод работает при настройке setEditStrategy(QSqlTableModel::OnManualSubmit)
    model->submitAll();//сохранить все изменения в таблице
    }

    //функция для вставки значений в БД
    void MainWindow::inserttodb(){
    //подключить БД по ее адресу на компьютере
    db.setDatabaseName("/home/mishanyya/fordbwork/examplebdfordbwork");
    //открывает базу данных, указанную в db.setDatabaseName("/home/mishanyya/fordbwork/examplebdfordbwork");
    db.open();
    //ввод данных из полей в переменные
    QString vname=ui->lineEdit->text();
    QString vfone=ui->lineEdit_2->text();
    QString vautomodel=ui->lineEdit_3->text();
    QString vprice=ui->lineEdit_4->text();
    //создание объекта для запроса
    QSqlQuery query;
    //создание подготовленного запроса
    query.prepare("INSERT INTO basetable (name, fone,automodel,price) VALUES (:name, :fone,:automodel,:price)");
    //вставка знасений в запрос
    query.bindValue(":name", vname);
    query.bindValue(":fone", vfone);
    query.bindValue(":automodel", vautomodel);
    query.bindValue(":price", vprice);
    //исполнение SQL запроса
    query.exec();
    }

    //функция, которая должна выводить базу данных в таблице при запуске программы
    void MainWindow::createTable(){
    //Общий код для QSqlTableModel, QSqlRelationalTableModel и QSqlQueryModel:
    //подключить БД по ее адресу на компьютере
    db.setDatabaseName("/home/mishanyya/fordbwork/examplebdfordbwork");
    //открывает базу данных, указанную в db.setDatabaseName("/home/mishanyya/fordbwork/examplebdfordbwork");
    db.open();

    //Код для QSqlTableModel и QSqlRelationalTableModel - таблиц с редактируемыми ячейками
    //QSqlRelationalTableModel работает также как QSqlTableModel, но позволяет настройку внешних ключей с другими таблицами
    model->setTable("basetable");//выбирается существующая табл БД
    //Возможны значения для редактирования записей:
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);//настраивается редактирование таблицы
    //model->setEditStrategy(QSqlTableModel::OnFieldChange);//данные сохранятся в БД сразу при переходе на другую ячейку
    //model->setEditStrategy(QSqlTableModel::OnRowChange);//данные сохранятся в БД сразу при переходе на другую строку
    model->select();//заполняет модель данными из таблицы, без этого кода выйдет пустая таблица
    ui->tableView->setModel(model);//выводит в виде таблицы все элементы в окне приложения

    /*
    //Код для QSqlQueryModel - таблиц только для чтения информации через запросы SQL
    model1->setQuery("SELECT * FROM basetable");//в модель помещается результат SQL запроса к существующим в БД, таблице и полям
    ui->tableView->setModel(model1);//выводит в виде таблицы все элементы в окне приложения, не работает в функции main()
    */ }

  • В фунуции createTable указано сразу два различных части кода для работы с разными классами таблиц, во избежание ошибок одна из частей взята в комментарии /* и */. одна или другая часть кода должны быть всегда заккоментированы!