2015-09-28 75 views
1

我可以在運行時管理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查詢從一個更改爲類似。

+0

閱讀文檔。不,你不能修改'QSqlQueryModel'中的數據。 請記住'QSqlQueryModel'是用來解析查詢的響應。 'QSqlQueryModel'不能分析這個sql查詢來找出如何更新數據庫。 作爲一名程序員,您有如何正確更新數據庫的知識,並且您必須使用這些知識,以便您的應用程序可以在這類數據庫上執行更新。 –

+0

@MarekR,我不想修改數據並更新數據庫中的數據,我只需要將「select」查詢從一個更改爲另一個(兩者都發往同一個表)。該查詢的結果包括相同的列和他們的角色。爲什麼我不能使用QSqlQueryModel來做到這一點? – Oopscurity

回答

0

這很奇怪,但正確的答案是在問題中。

那裏描述的實現工作正常。也許,由於潛伏或漏洞進入項目源代碼,它變得很糟糕。