代码:
queryModel = new QSqlQueryModel();
QSqlQuery sql;
QString strSql = "{CALL syllabi_output}";
sql.exec(strSql);
queryModel->setQuery(sql);
ui->tableView_4->setModel(queryModel);存在标题,但没有行。
存储过程在Management Studio中工作正常(两行)。
发布于 2015-08-16 16:24:56
查询是一个局部变量,一旦超出作用域就会被析构。您可能会在方法或构造函数中调用它,因此在视图有机会对查询数据执行任何操作之前,作用域很快就结束了。查询模型的存留时间超过查询,并且没有数据可供提供,因此视图显示为空。
相反,您应该将模型和查询一起持久化。例如:
class Widget : public QWidget {
Q_OBJECT
Widget::Ui ui;
QSqlQueryModel m_model;
QSqlQuery m_modelQuery;
...
public:
void runQuery() {
m_modelQuery.exec(QStringLiteral("{CALL syllabi_output}"));
m_model.setQuery(m_modelQuery);
ui.tableView_4->setModel(&m_model);
}
...
};如果查询总是简单的,并且您总是希望立即执行它,那么您可以使用另一个setQuery重载:
class Widget : public QWidget {
Q_OBJECT
Widget::Ui ui;
QSqlQueryModel m_model;
...
public:
void runQuery() {
m_model.setQuery(QStringLiteral("{CALL syllabi_output}"));
ui.tableView_4->setModel(&m_model);
}
...
};请注意,没有将ui或查询模型存储为指针的目的。如果您坚持延迟实例化查询模型,您当然可以这样做:
class Widget : public QWidget {
Q_OBJECT
Widget::Ui ui;
QPointer<QSqlQueryModel> m_model; // this is a non-owning pointer
...
public:
void runQuery() {
if (m_model.isNull()) m_model = new QSqlQueryModel(this);
m_model->setQuery(QStringLiteral("{CALL syllabi_output}"));
ui.tableView_4->setModel(&m_model);
}
...
};发布于 2017-06-16 23:21:21
我发现这样做是为了解决类似的问题。除了Kubar提到的变量作用域之外,还有一些其他的Qt和SQL Server问题。
QSqlQueryModel只能与forward-only queriessetForwardOnly(false)仅是一个建议This answer from Qt Forum对此进行了更详细的介绍。
https://stackoverflow.com/questions/32032530
复制相似问题