【问题标题】:Python 3.5.1: QVariant represents a mapped type and cannot be instantiatedPython 3.5.1:QVariant 表示映射类型,无法实例化
【发布时间】:2016-04-26 01:22:43
【问题描述】:

我正在使用 Python 3.5.1,我正在尝试运行此代码,但我遇到了 QVariant 问题

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
class Model(QAbstractTableModel):
    def __init__(self, parent=None, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.items = ['Item_A_001','Item_A_002','Item_B_001','Item_B_002']

    def rowCount(self, parent=QModelIndex()):
        return len(self.items)       
    def columnCount(self, parent=QModelIndex()):
        return 1

    def data(self, index, role):
        if not index.isValid(): return QVariant()
        elif role != Qt.DisplayRole:
            return QVariant()

        row=index.row()
        if row<len(self.items):
            return QVariant(self.items[row])
        else:
            return QVariant()

class Proxy(QSortFilterProxyModel):
    def __init__(self):
        super(Proxy, self).__init__()
        self.filterActive = False

    def setView(self, view):
        self._view = view

    def filterAcceptsRow(self, row, parent):
        if self.filterActive and '_B_' in self.sourceModel().data(self.sourceModel().index(row, 0), Qt.DisplayRole).toPyObject():
        self._view.selectRow(row)
        return True

class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        tableModel=Model(self)               

        proxyModel=Proxy()
        proxyModel.setSourceModel(tableModel)

        self.tableview=QTableView(self) 
        self.tableview.setModel(proxyModel)
        self.tableview.horizontalHeader().setStretchLastSection(True)
        self.tableview.setSelectionMode(QAbstractItemView.MultiSelection)

        proxyModel.setView(self.tableview)

        button=QPushButton(self)
        button.setText('Select Items with B')
        button.clicked.connect(self.clicked)

        layout = QVBoxLayout(self)
        layout.addWidget(self.tableview)
        layout.addWidget(button)
        self.setLayout(layout)

    def clicked(self, arg):
        proxyModel=self.tableview.model()
        self.tableview.clearSelection()
        proxyModel.filterActive = True
        proxyModel.invalidateFilter()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

确实,当我执行此代码时,会出现一条错误消息: QVariant Represents a mapped kind and can not be instantiated 。 我试图删除 QVariant 并将 None 放在适当的位置

def data(self, index, role):
    if not index.isValid(): return None
    elif role != Qt.DisplayRole:
        return None

    row=index.row()
    if row<len(self.items):
        return (self.items[row])
    else:
        return None

但出现新的错误信息:'str' object has no attribute 'toPyObject'。

谢谢你帮助我

【问题讨论】:

    标签: python python-3.x pyqt4


    【解决方案1】:

    正如您所发现的,默认情况下,QVariant 在与 Python3 一起使用时在 PyQt4 中不存在。相反,所有内容都会自动转换为等效的 python 类型。因此,您需要做的就是在通常期望使用QVariant.null 的任何地方使用None,并避免尝试使用任何QVariant 方法(例如toPyObject,无论如何这显然是多余的)。

    【讨论】:

    • 我试图删除 toPyObject 但是当我执行时,代码什么也不做。你知道怎么换吗?
    • @A.Rym。你不需要用任何东西替换它。将返回一个 python 字符串而不是 QVariant(这是错误消息告诉您的内容)。如果我做出答案中建议的更改,则代码对我来说很好。你期待它做什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2014-12-30
    • 2019-07-26
    • 2013-09-27
    • 2015-04-30
    • 1970-01-01
    相关资源
    最近更新 更多