2016-04-25 69 views
2

我使用Python 3.5.1工作,我试图运行此代码,但我有问题的QVariant的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表示映射类型,无法实例化。 我试图删除的QVariant,并把无就地

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”对象有没有属性“toPyObject”。

谢谢你帮我

回答

0

正如您所发现的,在默认情况下,QVariant不PyQt4中与Python3使用时存在。相反,一切都会自动转换为等效的python类型。因此,只需要使用None就可以得到QVariant.null,并且避免尝试使用任何QVariant方法(如toPyObject,这显然是多余的)。

+0

我试图删除toPyObject,但是当我执行时,代码什么都不做。你有什么想法如何取代它? –

+0

@ A.Rym。你不需要用任何东西代替它。一个python字符串将被返回而不是'QVariant'(这是错误信息告诉你的)。如果我在我的答案中提出了更改,代码对我来说工作正常。你期待它做什么? – ekhumoro