现在是从数据库里查出数据,并显示到控件tableView上,我使用的是QSqlTableModel类,缩减后的代码如下:
C/C++ code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
voidMainWindow::SelectData()
{
QString conn;
{
QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("test.db");
conn=QSqlDatabase::database().connectionName();
db.open();
QSqlTableModel *model=newQSqlTableModel(this,db);
model->setTable("TestTool");
model->select();
ui->tableView->setModel(model);
ui->tableView->show();
db.close();
qDebug()<<"Congratulations~Selected Successfully~";
}
QSqlDatabase::removeDatabase(conn);
} |
void MainWindow::SelectData()
{
QString conn;
{
QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("test.db");
conn=QSqlDatabase::database().connectionName();
db.open();
QSqlTableModel *model=new QSqlTableModel(this,db);
model->setTable("TestTool");
model->select();
ui->tableView->setModel(model);
ui->tableView->show();
db.close();
qDebug()<<"Congratulations~Selected Successfully~";
}
QSqlDatabase::removeDatabase(conn);
}
问题来了,每次执行此方法,系统都会报:
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
而如果不用QSqlTableModel类,却不会有这样的错误:
C/C++ code
void MainWindow::SelectData()
{
QString conn;
{
QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("test.db");
conn=QSqlDatabase::database().connectionName();
db.open();
QSqlQuery q;
q.exec("select * from TestTool,TestProgram where TestTool.ToolId=TestProgram.TestId");
while(q.next())
{
ui->textEdit->append(q.value(1).toString());//append自带换行无需加'\n'
}
q.clear();
db.close();
}
QSqlDatabase::removeDatabase(conn); // correct
}
原因可能出在没有解除QSqlTableModel和Sqlite数据库的连接上,小弟刚刚玩Qt,想请问下如何解除QSqlTableModel和Sqlite数据库的连接
解决办法:
:
主函数中打开一次数据库连接
C/C++ code
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "main.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ConnectDB();
MainWindow w;
w.show();
return a.exec();
}
其中自定义函数在main.h文件中:
C/C++ code
#ifndef MAIN_H
#define MAIN_H
void ConnectDB()
{
QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("test.db");
}
#endif // MAIN_H
界面类源文件中使用到数据库的地方不再打开数据库:
C/C++ code
void MainWindow::SelectData()
{
QSqlTableModel *model=new QSqlTableModel(this,db);
model->setTable("TestTool");
model->select();
ui->tableView->setModel(model);
ui->tableView->show();
qDebug()<<"Congratulations~Selected Successfully~";
}