QSqlTableModel变量定义时遇到的问题

1.发现问题

在做一个Qt+Sqllite的程序时,定义了一个QSqlTableModel变量在MainWindow类(QSqlTableModel model;)中,可是无论怎么都无法从数据库表中读出数据(数据库连接是成功的)。

#endif // MAINWINDOW_H

2.问题进展

无法运行后发现之前写的代码是定义成指针的形式的,如:QSqlTableModel *model;,这时在MainWindow的构造函数中需要new一下,果然可以输出数据库表中内容。

3.解决问题

于是果断的查询了下源码和帮助文档


如果数据库是无效的,不链接默认的数据库中。所以推测在MainWindow类是定义变量QSqlTableModel model;无法在定义时链接到打开的数据库(或者说此时数据库还没有打开)。

所以如果在MainWindow类中定义就要定义成指针的形式。

database.h代码

#ifndef DATABASE_H
#define DATABASE_H
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QObject>
static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("waterData.db");
    if(!db.open()) return false;
    QSqlQuery query;
    query.exec(QObject::tr("create table user (id int, name vchar primary key,passWord vchar)"));
    query.exec(QObject::tr("insert into user values (1,'Tom',999)"));
    query.exec(QObject::tr("insert into user values (2,'Lily',888)"));
    query.exec(QObject::tr("insert into user values (3,'Lucy',666)"));
    query.exec(QObject::tr("insert into user values (4,'小强',555)"));
return true;
}
#endif // DATABASE_H


MainWindow.h代码

在Mainwindow类中定义QSqlTableModel *model;

MainWindow构造函数代码

    bool sqlState =createConnection();
    if(sqlState)
    {
        qDebug()<<"The database is open !";
    }
    else
    {
        qDebug()<<"open failed !";
    }
    model->setTable("user");
    model->select();
    for(int i=0;i<model->rowCount();++i)
    {
        QSqlRecord record = model->record(i);
        QString name = record.value("id").toString();
        qDebug()<<name<<__FUNCTION__;
    }

    model = new QSqlTableModel();
    model->setTable("user");
    model->select();
    for(int i=0;i<model->rowCount();++i)
    {
        QSqlRecord record = model->record(i);
        QString name = record.value("id").toString();
        qDebug()<<name<<__FUNCTION__;
    }

在处理 `QSqlTableModel` 网络中断重连问题,可从监测网络状态、处理数据库连接中断和重新建立连接等方面着手。 #### 监测网络状态 可使用 `QNetworkAccessManager` 来监测网络状态。当网络中断,触发相应的处理逻辑。示例代码如下: ```cpp #include <QNetworkAccessManager> #include <QNetworkReply> #include <QNetworkRequest> QNetworkAccessManager *manager = new QNetworkAccessManager(this); QNetworkRequest request(QUrl("http://www.example.com")); QNetworkReply *reply = manager->get(request); connect(reply, &QNetworkReply::finished, [=]() { if (reply->error() != QNetworkReply::NoError) { // 网络中断,处理重连逻辑 } reply->deleteLater(); }); ``` #### 处理数据库连接中断 在网络中断,数据库连接可能会断开。可通过 `QSqlDatabase` 和 `QSqlQuery` 的 `lastError` 函数获取错误信息,判断是否是连接中断错误。示例代码如下: ```cpp #include <QSqlDatabase> #include <QSqlError> if (db.lastError().type() != QSqlError::NoError) { // 数据库连接中断,处理重连逻辑 } ``` #### 重新建立连接 当检测到网络中断并处理完相关逻辑后,需要重新建立数据库连接。示例代码如下: ```cpp #include <QSqlDatabase> QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("your_database.db"); if (!db.open()) { // 重新连接失败,处理错误 } ``` #### 刷新 `QSqlTableModel` 重新建立连接后,需要刷新 `QSqlTableModel` 以确保数据的正确性。示例代码如下: ```cpp #include <QSqlTableModel> QSqlTableModel *model = new QSqlTableModel(this, db); model->setTable("your_table"); model->select(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值