代码:
queryModel = new QSqlQueryModel();
QSqlQuery sql;
QString strSql = "{CALL syllabi_output}";
sql.exec(strSql);
queryModel->setQuery(sql);
ui->tableView_4->setModel(queryModel);
标题存在,但没有行。
存储过程在Management Studio中正常工作(两行)。
答案 0 :(得分:0)
查询是一个局部变量,一旦超出范围就会被破坏。您可能在方法或构造函数中调用它,因此在视图有可能对查询的数据执行任何操作之前,范围会很快结束。查询模型比查询更长,并且没有要提供的数据,因此视图显示为空。
相反,您应该同时保留模型和查询。例如:
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);
}
...
};
答案 1 :(得分:0)
我发现这试图解决类似的问题。除了Kubar提到的变量范围之外,还有一些其他Qt和SQL Server问题。
QSqlQueryModel
只能与仅向前查询一起使用setForwardOnly(false)
只是一个建议