Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Không thể hiển thị dữ liệu từ QSqlQueryModel trong Chế độ xem bảng QML

Được rồi, nhận xét của bạn nhắc nhở tôi rằng bạn thực sự cần thực hiện lại data() vì lợi ích của mô hình QML. Tại sao? Vì mô hình của QML gọi data() với các vai trò được cung cấp bởi roleName (). Nó không gọi data() với Qt::DisplayRole như trong thế giới QWidget. Hơn nữa, bạn cần xác định TableViewColumn với tên vai trò, nếu không mô hình sẽ không gọi data() . Đây là một ví dụ về cách bạn có thể thực hiện lại 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)

Thêm TableViewColumn tới TableView . Hãy nhớ rằng vai trò có phân biệt chữ hoa chữ thường. Chúng phải khớp chính xác với những gì roleNames () trả về:

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"
    }

}

Đây là một cách để tự động tạo TableViewColumn. Nó gọi vị trí roleNameArray được xác định trong mã python ở trên để lấy danh sách tên vai trò. Chúng tôi không gọi roleNames () ở đây vì tôi không biết cách làm cho QML hiểu kết quả mà nó trả về :), vì vậy chúng tôi phải chuyển đổi nó thành một danh sách. Cuối cùng, chúng tôi lặp qua danh sách và gọi TableView.addColumn để tạo các cột:

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. Tạo một bảng với các tên cột bắt nguồn từ các giá trị hàng của một bảng khác

  2. Chèn cơ sở dữ liệu không đồng bộ - python + mysql

  3. Hibernate có thể hoạt động với cú pháp ON DUPLICATE KEY UPDATE của MySQL không?

  4. Làm cách nào để chọn nhiều hàng theo khóa chính nhiều cột trong MySQL?

  5. Truy vấn Mysql với Left Join quá chậm