sql >> データベース >  >> RDS >> Mysql

QSqlQueryModelのデータをQMLTableViewに表示できません

    わかりました、あなたのコメントはあなたが本当にdata()を再実装する必要があることを私に思い出させました QMLのモデルのために。なんで? QMLのモデルはdata()を呼び出すため roleName()によって与えられた役割で。 data()は呼び出されません Qt::DisplayRoleを使用 QWidgetの世界のように。さらに、TableViewColumnを定義する必要があります ロール名を使用する場合、それ以外の場合、モデルはdata()を呼び出しません。 。 data()を再実装する方法の例を次に示します。 :

    import sys
    from PyQt5.QtCore import QUrl, Qt, QVariant
    from PyQt5.QtCore import QObject, pyqtSlot
    from PyQt5.QtGui import QGuiApplication
    from PyQt5.QtQuick import QQuickView
    from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlQueryModel
    
    class QtTabModel(QSqlQueryModel):
        def __init__(self):
            super(QtTabModel, self).__init__()
    
        def roleNames(self):
            roles = {
                Qt.UserRole + 1 : 'id',
                Qt.UserRole + 2 : 'name'
            }
            return roles
    
        def data(self, index, role):
            if role < Qt.UserRole:
                # caller requests non-UserRole data, just pass to papa
                return super(QtTabModel, self).data(index, role)
    
            # caller requests UserRole data, convert role to column (role - Qt.UserRole -1) to return correct data
            return super(QtTabModel, self).data(self.index(index.row(), role - Qt.UserRole -1), Qt.DisplayRole)
    
        @pyqtSlot(result=QVariant)  # don't know how to return a python array/list, so just use QVariant
        def roleNameArray(self):
            # This method is used to return a list that QML understands
            list = []
            # list = self.roleNames().items()
            for key, value in self.roleNames().items():
                list.append(value)
    
            return QVariant(list)
    

    TableViewColumnを追加します TableViewへ 。役割では大文字と小文字が区別されることに注意してください。これらは、roleNames()が返すものと完全に一致する必要があります:

    import QtQuick 2.2
    import QtQuick.Controls 1.1
    
    TableView {
        width: 200
        height: 300
        model: tabmodel
        TableViewColumn {
            role: "id" // case-sensitive, must match a role returned by roleNames()
        }
        TableViewColumn {
            role: "name"
        }
    
    }
    

    TableViewColumnを自動的に生成する方法は次のとおりです。上記のPythonコードで定義されたroleNameArrayスロットを呼び出して、役割名リストを取得します。 QMLに返される結果を理解させる方法がわからないため、ここではroleNames()を呼び出さないので、リストに変換する必要があります。最後に、リストをループし、TableView.addColumnを呼び出して列を作成します。

    TableView {
        width: 200
        height: 300
        model: tabmodel
        Component.onCompleted: {
            var roles = model.roleNameArray()
            for (var i=0; i<roles.length; i++) {
              var column = addColumn( Qt.createQmlObject(
                "import QtQuick.Controls 1.1; TableViewColumn {}",
                this) )
              column.role = roles[i]
              column.title = roles[i]
            }
        }
    
    }
    



    1. フォームからデータベースPDOにデータを入力する

    2. クラウド内のMySQL-AmazonRDSの長所と短所

    3. PHP MySQLi権限が拒否されましたが、MySQLCLIから機能しています

    4. LIMITを使用して、MySQLクエリの結果をページ分割します