2016-04-25 14 views
2

instanziiert werden kann ich mit Python 3.5.1 gerade arbeite und ich versuche, diesen Code zu laufen, aber ich habe ein Problem mit QVariantPython 3.5.1: QVariant stellt einen zugeordnetes Typen und nicht

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_()) 

Tat Wenn ich diesen Code ausführe, erscheint eine Fehlermeldung: QVariant Repräsentiert einen zugeordneten Typ und kann nicht instanziiert werden. Ich versuchte inplace die QVariant und setzen keine

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 

Aber eine neue Fehlermeldung zu entfernen, erscheint: ‚str‘ Objekt kein Attribut ‚toPyObject‘.

Danke mir geholfen

Antwort

0

Wie Sie herausgefunden haben, standardmäßig QVariant existiert nicht in PyQt4, wenn sie mit Python3 verwendet. Stattdessen wird alles automatisch in einen äquivalenten Python-Typ konvertiert. Alles, was Sie tun müssen, ist None zu verwenden, wo immer normalerweise erwartet wird, und vermeiden Sie zu versuchen, irgendwelche QVariant Methoden zu verwenden (wie toPyObject, die sowieso offensichtlich redundant ist).

+0

Ich habe versucht, ToPyObject zu entfernen, aber wenn ich ausführe, tut der Code nichts. Haben Sie eine Idee, wie Sie es ersetzen können? –

+0

@ A.Rym. Sie müssen es nicht durch irgendetwas ersetzen. Eine Python-Zeichenfolge wird anstelle eines 'QVariant' zurückgegeben (was die Fehlermeldung Ihnen sagt). Wenn ich die Änderungen in meiner Antwort vorgeschlagen habe, funktioniert der Code gut für mich. Was hast du erwartet? – ekhumoro

Verwandte Themen