2015-01-08 6 views
2
C에서

++ (Qt는) : QML에서Qt의 SQL 쿼리 출력 모델을 QML의 TableView에 할당하는 방법은 무엇입니까?

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

는 :

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 나타납니다!

도움이 필요합니다.

답변

6

당신은 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(); 
    } 
}; 

main.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" } 
    } 
} 
+1

QSqlQueryModel를 서브 클래스 화해, 재 구현해야합니다. 추가 힌트를 찾았습니다. http://qt-project.org/wiki/How_to_use_a_QSqlQueryModel_in_QML –

+0

@TheIndependentAquarius 링크가 더 이상 유효하지 않습니다. 어떻게 문제를 해결 했습니까? – KernelPanic

+0

@KernelPanic :이 링크는 현재 https://wiki.qt.io/How_to_use_a_QSqlQueryModel_in_QML ... 더 읽을 거리가 있습니다. – Bugfinger