Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

QML तालिका दृश्य में QSqlQueryModel से डेटा प्रदर्शित नहीं कर सकता

ठीक है, आपकी टिप्पणी ने मुझे याद दिलाया कि आपको वास्तव में data() . को फिर से लागू करने की आवश्यकता है क्यूएमएल के मॉडल के लिए। क्यों? क्योंकि QML का मॉडल data() calls को कॉल करता है 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 . ध्यान रखें कि भूमिका केस-संवेदी होती है। उन्हें ठीक उसी भूमिका से मेल खाना चाहिए जो नाम () देता है:

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 को स्वचालित रूप से जेनरेट करने का एक तरीका यहां दिया गया है। यह रोल नाम सूची प्राप्त करने के लिए उपरोक्त पायथन कोड में परिभाषित roleNameArray स्लॉट को कॉल करता है। हम यहाँ roleNames() नहीं कहते हैं क्योंकि मुझे नहीं पता कि QML को उसके द्वारा दिए गए परिणाम को कैसे समझा जाए :), इसलिए हमें इसे एक सूची में बदलना होगा। अंत में हम सूची के माध्यम से लूप करते हैं और कॉलम बनाने के लिए 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL EXP () फंक्शन - रिटर्न ई राइज़ टू द पावर ऑफ़ x

  2. डबल-एन्कोडेड UTF8 वर्णों को कैसे ठीक करें (utf-8 तालिका में)

  3. MySQL तालिका में ट्री पथ प्राप्त करें

  4. MySQL में वैकल्पिक तर्कों के साथ एक फ़ंक्शन बनाएँ

  5. Mysql में ड्रॉप डेटाबेस के बाद डिस्क स्थान को पुनः प्राप्त करें