2015-09-28 72 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

这很奇怪,但正确的答案是在问题中。

那里描述的实现工作正常。也许,由于潜伏或漏洞进入项目源代码,它变得很糟糕。