现在是从数据库里查出数据,并显示到控件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~";
}