如何在运行时更改QSqlQueryModel子类的数据模型?

时间:2015-09-28 10:22:20

标签: c++ sql qt qml

我可以在运行时管理QSqlQueryModel的子类从QML代码调用其方法并更新(更改)当前模型吗? (数据发送到TableView)我该怎么做?

我的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()来更改当前模型并使用参数化SELECT查询对其进行更新:

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

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);
    }

是否可以使用QSqlQueryModel执行此操作?请帮我解决这个问题。

UPD:也许,为了允许从外部使用qmlRegisterType()类的Q_INVOKABLE方法,调用SqlQueryModel之类的函数是必要的(来自QML)然后在QML文件中初始化SqlQueryModel 作为类型。此后,我们可以将新的SqlQueryModel 类型TableView的数据model相关联。

UPD:我不需要编辑存储在数据库中的数据。我希望能够将SELECT查询从一个更改为类似。

1 个答案:

答案 0 :(得分:0)

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

这里描述的实现正常。也许,由于插入到项目源代码中的拼写错误或缺陷,它变得非常糟糕。