c++ - 如何在运行时改变QSqlQueryModel子类的数据模型?

标签 c++ sql qt qml

我能否在运行时从 QML 代码调用其方法并更新(更改)当前模型来管理 QSqlQueryModel 的子类? (数据发送到 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;
};

ma​​in.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()这样的函数,以便允许使用SqlQueryModel<的Q_INVOKABLE方法 从外部(从 QML)类,然后将 SqlQueryModel 初始化为 QML 文件中的类型。此后,我们可以将新的 SqlQueryModel type 连接为 TableView 的数据 model

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

最佳答案

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

那里描述的实现工作正常。也许,由于项目源代码中的拼写错误或缺陷,它变得很糟糕。

关于c++ - 如何在运行时改变QSqlQueryModel子类的数据模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32820694/

相关文章:

model-view-controller - 为什么 Qt 滥用模型/ View 术语?

c++ - 在头文件中声明和初始化常量

jquery - 在 ASP.NET MVC 3 下的 "Page-less"设计中使用 jQuery JSON 请求的 API 驱动设计有哪些缺点?

SQL(Postgres)为列表参数中的每个项目获取一行,其优先顺序由另一列指定

qt - QScrollArea 的元素不会重绘

c++ - 在Qt中保存下载的文件

c++ - 我需要一个静态函数的互斥量吗?

c++ - 在局部函数中分配和初始化指针

c++ - 使用私有(private)成员变量的返回类型推导

sql - 无法将用户定义的记录插入表中