QT创建操作多个数据库,并通过QTableView进行显示

        目前的一个项目中,需要使用到三个小的数据库在三个界面中存储对应产品的信息,同时支持在线编辑功能。考虑使用Qt 自带的数据库QSQLITE+QTableView控件实现。

上代码:

    /**.h**/
    /* 数据库连接类:数据库访问、数据库连接       */
    QSqlDatabase   sqlDatabase_1;
    QSqlDatabase   sqlDatabase_2;
    QSqlDatabase   sqlDatabase_3;
    /* 提供从数据库数据到用于数据表示的窗体的映射 */
    QSqlTableModel *productModel;
    QSqlTableModel *productMode2;
    QSqlTableModel *productMode3;
/**1.cpp**/
/* 以 QSQLITE 驱动方式打开或者创建数据库 */
sqlDatabase_1 = QSqlDatabase::addDatabase("QSQLITE");
sqlDatabase_1.setDatabaseName("Product1.db");

QSqlQuery query(sqlDatabase_1);
/* 使用指令式创建表     */
query.exec(“”)

productModel = new QSqlTableModel(this);
/* 模型设置表的名字,需要与数据库的表的名字相同           */
productModel ->setTable( "Product1" );
/* 成功则返回 true,查看数据库里是否有这个表格           */
productModel ->select();

/**2.cpp**/
/* 以 QSQLITE 驱动方式打开或者创建数据库 */
sqlDatabase_2 = QSqlDatabase::addDatabase("QSQLITE");
sqlDatabase_2.setDatabaseName("Product2.db");

QSqlQuery query(sqlDatabase_2);
/* 使用指令式创建表     */
query.exec(“”)

productMode2 = new QSqlTableModel(this);
/* 模型设置表的名字,需要与数据库的表的名字相同           */
productMode2 ->setTable( "Product2" );
/* 成功则返回 true,查看数据库里是否有这个表格           */
productMode2 ->select();

/**3.cpp**/
/* 以 QSQLITE 驱动方式打开或者创建数据库 */
sqlDatabase_3 = QSqlDatabase::addDatabase("QSQLITE");
sqlDatabase_3.setDatabaseName("Product3.db");

QSqlQuery query(sqlDatabase_3);
/* 使用指令式创建表     */
query.exec(“”)

productMode3 = new QSqlTableModel(this);
/* 模型设置表的名字,需要与数据库的表的名字相同           */
productMode3 ->setTable( "Product3" );
/* 成功则返回 true,查看数据库里是否有这个表格           */
productMode3 ->select();

        运行界面之后,在执行数据库操作的时候,发现只有Product1.db数据库正常,另两个异常。进一步测试,发现屏蔽任意两个,运行都是正常的,考虑数据库之间冲突了,查找发现:

         当多个数据库被创建时,需要指定第二个参数进行区分,否则会报错。所以修改程序:

sqlDatabase_1 = QSqlDatabase::addDatabase("QSQLITE");
sqlDatabase_2 = QSqlDatabase::addDatabase("QSQLITE", "sqlite1");
sqlDatabase_3 = QSqlDatabase::addDatabase("QSQLITE", "sqlite2");

        重新运行界面,发现只有Product1.db数据库在QTableView中可以显示,其他数据库显示不了。怀疑数据库创建失败,使用query指令创建几条记录。通过SQLiteSpy数据库软件查看数据库内容发现都是正常的,数据库创建成功。

        数据库正常,应该为显示过程中有问题,通过qDebug()打印select()函数的返回值,发现返回false,并且行数为0。

bool res = productModel1->select();
int  row = productModel1->rowCount();

qDebug()<<"res ="<<res;
qDebug()<<"row ="<<row;

        检查发现,QSqlTableModel类如下:

         构造函数也带有第二个参数,需要指定,修改程序对应的代码

productModel1 = new QSqlTableModel(this);
productModel2 = new QSqlTableModel(this, sqlDatabase2);
productModel3 = new QSqlTableModel(this, sqlDatabase3);

        再次运行界面,操作各个数据库都正常了。

        记录自己开过程中遇到的一些坑,非专业人士,欢迎大神补充纠正。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt 中使用数据库需要使用到 QSqlDatabase 类。要在多窗口中使用数据库,可以在程序启动时创建一个全局的 QSqlDatabase 对象,然后在每个窗口中使用该对象来进行数据库操作。具体步骤如下: 1. 在 main.cpp 中创建全局的 QSqlDatabase 对象,并在程序启动时打开数据库连接: ```c++ #include <QApplication> #include <QtSql> QSqlDatabase db; int main(int argc, char *argv[]) { QApplication a(argc, argv); // 打开数据库连接 db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("mydatabase.db"); if (!db.open()) { qDebug() << "Failed to open database."; return -1; } // 创建主窗口并显示 MainWindow w; w.show(); return a.exec(); } ``` 2. 在每个窗口中使用全局的 QSqlDatabase 对象来进行数据库操作: ```c++ #include <QMainWindow> #include <QtSql> class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: QSqlTableModel *model; private slots: void on_pushButton_clicked(); private: Ui::MainWindow *ui; }; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // 创建一个 QSqlTableModel 来显示数据库内容 model = new QSqlTableModel(this, db); model->setTable("mytable"); model->select(); // 将 QSqlTableModel 显示QTableView 中 ui->tableView->setModel(model); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { // 在按钮点击事件中插入一条数据 QSqlQuery query(db); query.prepare("INSERT INTO mytable (name, age) VALUES (:name, :age)"); query.bindValue(":name", "John"); query.bindValue(":age", 30); query.exec(); // 刷新 QSqlTableModel 显示的数据 model->select(); } ``` 在上面的示例中,我们在主窗口中创建了一个 QSqlTableModel,并将其显示QTableView 控件中。在按钮点击事件中,我们使用全局的 QSqlDatabase 对象来插入一条数据,并刷新 QSqlTableModel 显示的数据。在其他窗口中也可以使用同样的方法来访问全局的 QSqlDatabase 对象来进行数据库操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值