我可以在運行時管理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