最近弄一个QT的项目,需要SQLITE和SQLSERVER数据库同时支持,使用QSqlQueryModel +tableview显示数据,非常奇怪的事情发生了,使用SQLITE能正常显示数据,当使用SQL数据库的时候,只显示空行(比如5条记录,就显示5个空行,表头可以显示),数据不显示,检查确实查询到数据,但就是不显示,网上看到说不关闭数据库就能显示,测试后发现确实是这样,可以显示,但只要在窗体里面新增数据后,再刷新,又不显示了,不知哪里的问题,希望得到大家的帮助,源码如下:
//连接数据库
bool md::openDB(const QString& connectName)
{
if (SQLLEIXING=="SQL")
{
idName = connectName;
const QString connID(connectName);
if(QSqlDatabase::contains("qt_sql_default_connection"))
database = QSqlDatabase::database("qt_sql_default_connection");
else
database=QSqlDatabase::addDatabase("QODBC");
QString SQLSTR= QString("DRIVER={SQL SERVER};"
"SERVER=%1;"
"DATABASE=%2;"
"UID=%3;"
"PWD=%4;"
).arg(SERVER)
.arg("SENTRY_86GB")
.arg(UNAME)
.arg(PWD);
database.setDatabaseName(SQLSTR);
if (!database.open())
{
qWarning("Cannot open database,please reboot!");
QMessageBox::critical(0, qApp->tr("Cannot open database"),
database.lastError().databaseText(), QMessageBox::Cancel);
return false;
}
return true;
}
else
{
idName = connectName;
const QString connID(connectName);
if(QSqlDatabase::contains("qt_sql_default_connection"))
database = QSqlDatabase::database("qt_sql_default_connection");
else
database = QSqlDatabase::addDatabase("QSQLITE");
QString DatabasePath = QCoreApplication::applicationDirPath() + "/sentry"; //获取当前数据库路径
database.setDatabaseName(DatabasePath);
database.setUserName("");
database.setPassword("");
if (!database.open())
{
qDebug() << "Error: Failed to connect database." << database.lastError();
return false;
}
return true;
}
}
//frmjigou.h
namespace Ui {
class frmjigou;
}
class frmjigou : public QWidget
{
Q_OBJECT
public:
explicit frmjigou(QWidget *parent = nullptr);
~frmjigou();
QSqlQueryModel *mode;
bool finddata(QString strsql);
private:
Ui::frmjigou *ui;
private slots:
void on_listWidget_itemClicked(QListWidgetItem *item);
void onStateChanged(int state) ;
void on_tableView_clicked(const QModelIndex &index);
};
#endif // FRMJIGOU_H
//frmjigou.c
//显示数据
bool frmjigou::finddata(QString strsql)
{
md db;
ui->tableView->clearSpans();
bool ok=db.openDB("frmjigou");
if(!ok)
{
QMessageBox::warning(this,"错误","未连接,请检查.");
return false;
}
mode = new myTableModel(this); //myTableModel类是为了实现表格单击,双击
mode->setQuery(QString(strsql),db.database);
mode->setHeaderData(0,Qt::Horizontal,tr(""));
mode->setHeaderData(1, Qt::Horizontal, tr("编号"));
mode->setHeaderData(2, Qt::Horizontal, tr("机构名称"));
while (mode->canFetchMore())
mode->fetchMore();
ui->tableView->setModel(mode);
ui->tableView->show();
ui-> tableView-> setAlternatingRowColors( true); //使表格颜色交错功能为真
ui->tableView->horizontalHeader()->setSectionResizeMode(0,QHeaderView::ResizeToContents);
ui->tableView->horizontalHeader()->setStretchLastSection(true);
ui->tableView->setColumnWidth(0, 35);
ui->tableView->setColumnWidth(1, 50);
ui->tableView->setColumnWidth(2, 100);
db.closeDB();
return true;
}