我可以在运行时管理QSqlQueryModel
的子类,从QML代码调用其方法并更新(更改)当前模型? (数据发送到TableView
)我该怎么做?如何在运行时更改QSqlQueryModel的子类的数据模型?
我QSqlQueryModel
的子类:
class SqlQueryModel : public QSqlQueryModel
{
Q_OBJECT
public:
explicit SqlQueryModel(QObject *parent = 0);
void setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase());
void setQuery(const QSqlQuery &query);
QVariant data(const QModelIndex &index, int role) const;
QHash<int, QByteArray> roleNames() const { return m_roleNames; }
private:
void generateRoleNames();
QHash<int, QByteArray> m_roleNames;
};
main.cpp中:
// ...
SqlQueryModel sqlQueryModel;
QQuickView view;
QQmlContext *context = view.rootContext();
context->setContextProperty("sqlQueryModel", &sqlQueryModel);
// ...
例如,我需要调用Q_INVOKABLE
方法changeModel()
在改变运行时间当前模型并使用参数化的进行更新它使用QSqlQueryModel
TableView {
id: view
model: sqlQueryModel
TableViewColumn {
title: "1st field"
role: "someValue"
delegate: Text {
text: styleData.value
}
}
TableViewColumn {
title: "2nd field"
role: "oneMoreValue"
delegate: Text {
text: styleData.value
}
}
}
// ...
onSomeSignal: {
// query like this:
sqlQueryModel.changeModel(someValue);
}
是否有可能做的事:查询:
void SqlQueryModel::changeModel(const int someValue)
{
QString statement;
QSqlQuery query;
statement = "SELECT * FROM 'tablename' WHERE some_field = ?;";
query.prepare(statement);
query.addBindValue(someValue);
query.exec();
setQuery(query);
}
而作为结果,我们得到的数据更新到TableView
?请帮我解决这个问题。
UPD:也许,这是必要的,以便允许使用从外部(从QML)SqlQueryModel
类的Q_INVOKABLE
方法,然后初始化SqlQueryModel
作为QML文件内的类型呼叫功能等qmlRegisterType()
。此后,我们可以将我们的新型SqlQueryModel
型号作为TableView
的数据model
。
UPD:我不需要编辑存储在数据库中的数据。我希望能够将SELECT
查询从一个更改为类似。
阅读文档。不,你不能修改'QSqlQueryModel'中的数据。 请记住'QSqlQueryModel'是用来解析查询的响应。 'QSqlQueryModel'不能分析这个sql查询来找出如何更新数据库。 作为一名程序员,您有如何正确更新数据库的知识,并且您必须使用这些知识,以便您的应用程序可以在这类数据库上执行更新。 –
@MarekR,我不想修改数据并更新数据库中的数据,我只需要将“select”查询从一个更改为另一个(两者都发往同一个表)。该查询的结果包括相同的列和他们的角色。为什么我不能使用QSqlQueryModel来做到这一点? – Oopscurity