如何将 Qt 中的 SQL 查询输出模型分配给 QML 的 TableView?

Posted

技术标签:

【中文标题】如何将 Qt 中的 SQL 查询输出模型分配给 QML 的 TableView?【英文标题】:How to assign SQL query output model from Qt to QML's TableView? 【发布时间】:2015-01-08 11:46:18 【问题描述】:

来自 C++ (Qt):

int main(int argc, char *argv[])

    QApplication app(argc, argv);

    /*
     * I have omitted the code about connection with the database and all for ease of   
     * viewing the code.
     */


    // My own function for filling in the data in the `QSqlQueryModel`
    QSqlQueryModel* model = new QSqlQueryModel;
    QString binid = "B1";
    QString query = "SELECT t1.BinId, t1.PartitionId, t2.UnitId, t2.ItemCount FROM Bin_Partitions AS t1 "
                    "INNER JOIN Partition_Units AS t2 ON t1.PartitionId = t2.PartitionId "
                    "WHERE t1.BinId ='" + binid + "'";
    model->setQuery(query);

    /*
     * I can see that the query runs successfully because the following
     * QTableView DOES get populated properly. 
     */
    // Use QTableView to visualize
    QTableView *view = new QTableView;
    view->setModel(model);
    view->show();

    QQmlApplicationEngine engine;
    // Passing the same model to QML for displaying in the TableView.
    engine.rootContext()->setContextProperty ("SQQL", model);
    engine.load(QUrl(QStringLiteral("/home/.../main.qml")));

    QObject               *topLevel  = engine.rootObjects ().value (0);
    QQuickWindow          *window    = qobject_cast <QQuickWindow *> (topLevel);

    return app.exec();

来自 QML:

import QtQuick 2.2
import QtQuick.Window 2.1
import QtQuick.Controls 1.2

Window

    visible: true
    width: 360
    height: 360
    color: "blue"

    TableView
    
        TableViewColumn role: "col1" ; title: "BinId" ; visible: true
        TableViewColumn role: "col2" ; title: "PartitionId" 
        TableViewColumn role: "col3" ; title: "UnitId" 
        TableViewColumn role: "col4" ; title: "ItemCount" 

        model: SQQL
    

QML的TableView显示为EMPTY!

我需要帮助。

【问题讨论】:

【参考方案1】:

您必须继承 QSqlQueryModel 并重新实现 roleNamesdata 方法

MySqlModel.h

class mysqlModel: public QSqlQueryModel

    Q_OBJECT
public:
    MySqlModel(QObject *parent = 0) : QSqlQueryModel(parent) 

    enum Roles 
        BinId = Qt::UserRole + 1,
        PartitionId,
        UnitId,
        ItemCount
    ;
    QHash<int, QByteArray> roleNames() const 
        QHash<int, QByteArray> roles;
        roles[BinId] = "binIdRole";
        roles[PartitionId] = "partitionIdRole";
        roles[UnitId] = "unitIdRole";
        roles[ItemCount] = "itemCountRole";
        return roles;
    
    QVariant data(const QModelIndex &index, int role) const 
        if (!index.isValid())
            return QVariant();

        QString fieldName;
        switch (role) 
            case BinId: fieldName = QStringLiteral("t1.BinId"); break;
            case PartitionId: fieldName = QStringLiteral("t1.PartitionId"); break;
            case UnitId: fieldName = QStringLiteral("t2.UnitId"); break;
            case ItemCount: fieldName = QStringLiteral("t2.ItemCount"); break;
        
        if (!this->record().isGenerated(fieldName))
            return QVariant();
        else 
            QModelIndex item = indexInQuery(index);
            if ( !this->query().seek(item.row()) )
                return QVariant();
            return this->query().value(fieldName);
        
        return QVariant();
    
;

ma​​in.qml

Window  
    visible: true
    width: 640
    height: 480
    TableView 
        anchors.fill: parent
        model: SQQL
        TableViewColumn role: "binIdRole" ; title: "BinId" ; visible: true
        TableViewColumn role: "partitionIdRole" ; title: "PartitionId" 
        TableViewColumn role: "unitIdRole" ; title: "UnitId" 
        TableViewColumn role: "itemCountRole" ; title: "ItemCount" 
    

【讨论】:

非常感谢您。我在这里找到了进一步的提示:qt-project.org/wiki/How_to_use_a_QSqlQueryModel_in_QML @TheIndependentAquarius 链接不再有效。你是怎么解决问题的? @KernelPanic:链接现在在这里wiki.qt.io/How_to_use_a_QSqlQueryModel_in_QML ...只是为了进一步阅读,我猜。

以上是关于如何将 Qt 中的 SQL 查询输出模型分配给 QML 的 TableView?的主要内容,如果未能解决你的问题,请参考以下文章

如何将键(QtCore.Qt.Key_1)分配给python中的按钮。数字键盘

将表示 SQL 查询的记录数(计数)的值分配给 C# 中的变量

如何从 SQL Server 2014 中的 Select 查询中将数据分配给用户定义的表类型

过滤后如何将分配的属性保留给查询集对象?备择方案?

如何使用PowerShell将选择查询的输出从DataSet复制到日志文件?

如何分配自定义 SQL 查询,该查询返回行集合作为 ORM 模型的属性