Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Tidak dapat menampilkan data dari QSqlQueryModel di QML TableView

Oke, komentar Anda mengingatkan saya bahwa Anda memang perlu mengimplementasikan kembali data() demi model QML. Mengapa? Karena model QML memanggil data() dengan peran yang diberikan oleh roleName(). Itu tidak memanggil data() dengan Qt::DisplayRole seperti di dunia QWidget. Selanjutnya, Anda perlu mendefinisikan TableViewColumn dengan nama peran, jika tidak model tidak akan memanggil data() . Berikut adalah contoh bagaimana Anda dapat mengimplementasikan kembali 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)

Tambahkan TableViewColumn ke TableView . Ingatlah bahwa peran peka huruf besar-kecil. Mereka harus sama persis dengan apa yang dikembalikan 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"
    }

}

Berikut cara untuk menghasilkan TableViewColumn secara otomatis. Ini memanggil slot roleNameArray yang didefinisikan dalam kode python di atas untuk mendapatkan daftar nama peran. Kami tidak memanggil roleNames() di sini karena saya tidak tahu bagaimana membuat QML memahami hasil yang dikembalikannya :), jadi kami harus mengubahnya menjadi daftar. Akhirnya kita mengulang daftar dan memanggil TableView.addColumn untuk membuat kolom:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tidak dapat memperoleh beberapa entitas Tabel melalui prosedur Tersimpan menggunakan hibernasi

  2. MySQL dan PHP - bagaimana cara menampilkan semua baris di mana nilai bidang sama dengan x?

  3. Mengapa SQLSTATE[HY000]:Kesalahan umum?

  4. Sepertinya saya tidak dapat menghubungkan halaman PHP saya ke server dan database uji SQL saya

  5. Bagaimana GROUP BY DESC memilih urutannya?