Qt は Sqlite3 に接続し、Qtableview を使用してデータをリアルタイムで表示し、QSqlQueryModel を書き換えてテキストの中央揃えを実現します。

シリーズ記事ディレクトリ

提示:这里是该系列文章的所有文章的目录
第1章:QtをSqlite3に接続しQtableviewを使ってデータをリアルタイム表示、QSqlQueryModelを書き換えてテキストセンタリングを実現
第2章:Qt上でSqliteデータベースを使って画像の読み書き表示を実現



序文

SQLiteとは何ですか?
SQLite は、自己完結型、サーバーレス、構成不要のトランザクション SQL データベース エンジンを実装するインプロセス ライブラリです。これは構成不要のデータベースです。つまり、他のデータベースとは異なり、システム内で構成する必要がありません。(新人チュートリアル「SQLite 入門」より)

前回の記事で、Qt で MySQL データベースを利用する方法を紹介しました。MySQL サーバーに接続する必要があり、MySQL ドライバーを取得するために Qt のソースコードをコンパイルする必要があり、使用するのが少し面倒です。プロジェクトに別のサーバー プロセスやオペレーティング システム (サーバーレス) が必要ない場合は、現時点でデータを保存するために SQLite データベースを使用することを選択できます。ここでは、Qt で独自のドライバーを備えた Sqlite3 データベースの使用方法を紹介します。この例は、タイトルの機能を説明するために使用されています。例の完全なコードを参照してください。間違いがある場合は、どなたでも批判して修正してください。

事業効果
画像の説明を追加してください


提示:以下是本篇文章正文内容,下面案例可供参考

1. SQLモジュールの導入

Qt プロジェクト ファイル (.pro ファイル) に SQL モジュールを追加します。

QT += sql

一部のプロには「Qt += core gui」があり、この後に直接追加できます。

QT += core gui sql

ヘッダーファイルを追加する

#include <QSqlQuery>
#include <QSqlError>
#include <QSqlDatabase>
#include <QSqlQueryModel>

第二に、データベースの基本的な操作

1. 指定した保存パスに今日の日付の名前のデータベースを作成し、開きます

QString dbPath = QCoreApplication::applicationDirPath() + "/SaveDbFile/";
QString dbName = dbPath + QDate::currentDate().toString("yyyyMMdd") + ".db";
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName(dbName);
if(!m_db.open())
{
    
    
    //打开失败打印
    qDebug()<<"数据库打开失败..."<<m_db.lastError();
}

2. dataTable という名前のデータテーブルを作成します。

QSqlQuery query(m_db);
QString createStr = "create table if not exists dataTable(id integer primary key autoincrement, data varchar(30), time datetime)";
query.exec(createStr);

3. dataTable テーブルにデータを挿入します。

QSqlQuery query(m_db);
query.prepare("insert into dataTable(data,time) values(:data,:time)");   //插入数据
query.bindValue(":data",data);
query.bindValue(":time",time);
query.exec();

3. 完全なコードの例

1.MySqlite3.pro

QT       += core gui sql

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += \
    main.cpp \
    mainwindow.cpp \
    mysqlmodel.cpp

HEADERS += \
    mainwindow.h \
    mysqlmodel.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${
    
    TARGET}/bin
else: unix:!android: target.path = /opt/$${
    
    TARGET}/bin
!isEmpty(target.path): INSTALLS += target

2.mysqlmodel.h

#ifndef MYSQLMODEL_H
#define MYSQLMODEL_H

#include <QSqlQueryModel>

class MySqlModel : public QSqlQueryModel
{
    
    
    Q_OBJECT

public:
    MySqlModel(QObject *parent = nullptr);
    QVariant data(const QModelIndex &item, int role) const override;

};
#endif // MYSQLMODEL_H

3.mysqlmodel.cpp

#include "mysqlmodel.h"

MySqlModel::MySqlModel(QObject *parent)
    : QSqlQueryModel(parent)
{
    
    

}

//设置文本居中
QVariant MySqlModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
{
    
    
    QVariant value = QSqlQueryModel::data(index,role);
    if(role == Qt::TextAlignmentRole)
    {
    
    
        value = Qt::AlignCenter;   //文本居中
        return value;
    }
    return value;
}

4.メインウィンドウ.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlQuery>
#include <QSqlError>
#include <QSqlDatabase>
//#include <QSqlQueryModel>
#include <QTimer>
#include <QDateTime>
#include <QDebug>

#include "mysqlmodel.h"

QT_BEGIN_NAMESPACE
namespace Ui {
    
     class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    
    
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void initWidget();

private slots:
    void slot_writeDataToDb();

    void on_cb_keepBottom_toggled(bool checked);
    void on_pb_start_clicked();
    void on_pb_stop_clicked();
    void on_pb_change_clicked();

private:
    Ui::MainWindow *ui;

    bool m_keepFlag;
    QTimer *m_timer;

    QSqlDatabase m_db;
    MySqlModel *m_model;
    MySqlModel *m_model2;

};
#endif // MAINWINDOW_H

5.メインウィンドウ.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    
    
    ui->setupUi(this);

    this->initWidget();
}

MainWindow::~MainWindow()
{
    
    
    delete ui;
    m_db.close();
}

//初始化界面
void MainWindow::initWidget()
{
    
    
    //初始化变量
    m_keepFlag = false;

    //以当天日期为名称创建数据库并打开
    QString dbPath = QCoreApplication::applicationDirPath() + "/SaveDbFile/";
    QString dbName = dbPath + QDate::currentDate().toString("yyyyMMdd") + ".db";
    m_db = QSqlDatabase::addDatabase("QSQLITE");
    m_db.setDatabaseName(dbName);
    if(!m_db.open())
    {
    
    
        //打开失败打印
        qDebug()<<"数据库打开失败..."<<m_db.lastError();
    }

    //创建名为dataTable的数据表
    QSqlQuery query(m_db);
    QString createStr = "create table if not exists dataTable(id integer primary key autoincrement, data varchar(30), time datetime)";
    query.exec(createStr);
    //创建名为dataTable2的数据表
    QString createStr2 = "create table if not exists dataTable2(id integer primary key autoincrement, test varchar(30), data varchar(30), time datetime)";
    query.exec(createStr2);

    //初始化表格模型
    m_model = new MySqlModel(this);
    QString initStr = "select * from dataTable;";   //获取dataTable表所有数据
    m_model->setQuery(initStr,m_db);
    while(m_model->canFetchMore())
    {
    
    
        m_model->fetchMore();   //为了显示全部数据,不然会出现只显示在256条数据的问题
    }
    m_model->setHeaderData(0,Qt::Horizontal,"序号");   //修改表名,不改的话与创建时的表名对应
    m_model->setHeaderData(1,Qt::Horizontal,"数据");
    m_model->setHeaderData(2,Qt::Horizontal,"时间");

    //初始化表格模型2
    m_model2 = new MySqlModel(this);
    QString initStr2 = "select * from dataTable2;";   //获取dataTable表所有数据
    m_model2->setQuery(initStr2,m_db);
    while(m_model2->canFetchMore())
    {
    
    
        m_model2->fetchMore();   //为了显示全部数据,不然会出现只显示在256条数据的问题
    }
    m_model2->setHeaderData(0,Qt::Horizontal,"序号");
    m_model2->setHeaderData(1,Qt::Horizontal,"测试");
    m_model2->setHeaderData(2,Qt::Horizontal,"数据");
    m_model2->setHeaderData(3,Qt::Horizontal,"时间");

    //设置表格属性,默认模型1
    ui->tableView->setModel(m_model);
    ui->tableView->horizontalHeader()->setStyleSheet("QHeaderView::section{background:white;color: black;}");   //区分列表头
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);              //整行选中
    ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);             //单行选中
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);               //设置只读
    ui->tableView->verticalHeader()->hide();                                         //隐藏行头
    ui->tableView->verticalHeader()->setDefaultSectionSize(33);                      //设置行宽
    //ui->tableView->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);   //自适应行宽
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);   //自适应列度
    ui->tableView->setShowGrid(true);                                                //表格网格线显示
    ui->tableView->setGridStyle(Qt::SolidLine);                                      //网格线画笔
    ui->tableView->setFocusPolicy(Qt::NoFocus);                                      //去除选中时虚线框
    ui->tableView->scrollToBottom();                                                 //保持滚动条在底部

    // 初始化定时器
    m_timer = new QTimer(this);
    connect(m_timer,SIGNAL(timeout()),this,SLOT(slot_writeDataToDb()));
}

//定时器槽,写入数据
void MainWindow::slot_writeDataToDb()
{
    
    
    //获取当前时间和数据(这里模拟一个随机数)
    QString data = QString::number(qrand());
    QString time = QTime::currentTime().toString("hh:mm:ss");

    //插入数据
    QSqlQuery query(m_db);
    query.prepare("insert into dataTable(data,time) values(:data,:time)");   //插入数据
    query.bindValue(":data",data);
    query.bindValue(":time",time);
    query.exec();

    //更新表格模型
    QString initStr = "select * from dataTable;";
    m_model->setQuery(initStr,m_db);
    while(m_model->canFetchMore())
    {
    
    
        m_model->fetchMore();   //确保数据显示完全
    }

    //插入数据2
    QSqlQuery query2(m_db);
    query2.prepare("insert into dataTable2(test,data,time) values(:test,:data,:time)");   //插入数据
    query2.bindValue(":test","测试文本");
    query2.bindValue(":data",data);
    query2.bindValue(":time",time);
    query2.exec();

    //更新表格模型2
    QString initStr2 = "select * from dataTable2;";
    m_model2->setQuery(initStr2,m_db);
    while(m_model2->canFetchMore())
    {
    
    
        m_model2->fetchMore();   //确保数据显示完全
    }

    //保持滚动条在底部
    if(m_keepFlag)
    {
    
    
        ui->tableView->scrollToBottom();
    }
}

//保持底部勾选框
void MainWindow::on_cb_keepBottom_toggled(bool checked)
{
    
    
    m_keepFlag = checked;
}

//定时器开始
void MainWindow::on_pb_start_clicked()
{
    
    
    m_timer->start(1000);   // 每秒执行一次
}

//定时器停止
void MainWindow::on_pb_stop_clicked()
{
    
    
    m_timer->stop();
}

//切换数据表
void MainWindow::on_pb_change_clicked()
{
    
    
    static bool changeFlag = true;
    if(changeFlag)
    {
    
    
        changeFlag = false;
        ui->tableView->setModel(m_model2);
    }
    else
    {
    
    
        changeFlag = true;
        ui->tableView->setModel(m_model);
    }
    ui->tableView->scrollToBottom();
}

6.メインウィンドウ.ui
画像の説明を追加してください

4. ダウンロードリンク

私の Baidu ネットワーク ディスク リンクの例: https://pan.baidu.com/s/17x9lUmWIWCvc8wJRw-5_jw
抽出コード: xxcj


要約する

この記事の例では、その日の日付を名前としてデータベースが自動的に作成され、その中に 2 つのデータ テーブルが作成されます。インターフェース上で、データ テーブルの切り替えボタンをクリックしてモデルを変更し、データベースを更新します。表示. タイマーを使用して、ライブラリへのデータ挿入操作をシミュレートし、データベースの内容をインターフェイス上にリアルタイムで表示します. フォーム上のデータ テキストの中央揃えは、MySqlModel クラスをカスタマイズすることで実現されます。 Sqlite データベースの挿入ステートメントとクエリ ステートメントのみが使用されており、これは比較的単純です。これらのステートメントについては、参考記事に詳細な紹介があります。


こんにちは:
一緒に学び、一緒に進歩しましょう。関連する質問がまだある場合は、ディスカッションのためにコメント領域にメッセージを残すことができます。

参考記事:
SQLite チュートリアルは、
Qt で SQLite データベースを使用する方法を 5 分で教えてくれます。非常に便利なのでコレクションにおすすめです。
QT6 データベース操作 - QSqlQueryModel を変更して QTableView の表示スタイルを完成させます

おすすめ

転載: blog.csdn.net/XCJandLL/article/details/130607421
おすすめ