2016-04-28 8 views
0

Der folgende Code erstellt einen einzelnen QTableView. Eine Instanz von QAbstractTableModel wird dann erstellt und diesem als Modell zugewiesen. Zuletzt wird die QItemDelegate der QTableView zugewiesen.So legen Sie Text für QLineEdit fest, wenn dieser als QItemDelegate mit QTableView verwendet wird

Die Spalte 0 wird mit QLineEdit gefüllt. Während Spalte 1 mit QComboBox besetzt ist. Aber auch wenn QLineEdit einen benutzerdefinierten Textwert zugewiesen ist, bleibt die QLineEdit leer. Es passiert nicht mit QComboBox, die richtig drei Elemente erhält: "Irgendwo", "Over", "The Rainbow".

enter image description here

Was mit dem Text vorab füllen Spalte 0 QLineEdits getan werden sollte?

from PyQt4 import QtCore, QtGui 
app = QtGui.QApplication([]) 

class Delegate(QtGui.QItemDelegate): 
    def __init__(self): 
     QtGui.QItemDelegate.__init__(self) 

    def createEditor(self, parent, option, index): 
     if index.column()==0: 
      lineedit=QtGui.QLineEdit(parent) 
      lineedit.setText('Somewhere over the rainbow') 
      return lineedit 
     elif index.column()==1: 
      combo=QtGui.QComboBox(parent) 
      combo.addItems(['Somewhere','Over','The Rainbow']) 
      combo.setCurrentIndex(index.row()) 
      return combo 

class Model(QtCore.QAbstractTableModel): 
    def __init__(self): 
     QtCore.QAbstractTableModel.__init__(self) 
     self.items = [[1, 'one', None], [2, 'two', None], [3, 'three', None]] 

    def rowCount(self, parent=QtCore.QModelIndex()): 
     return 3 
    def columnCount(self, parent=QtCore.QModelIndex()): 
     return 3 

    def data(self, index, role): 
     if not index.isValid(): return 
     row = index.row() 
     column = index.column() 
     if role == QtCore.Qt.DisplayRole: 
      return self.items[row][column] 

tableModel=Model() 
tableView=QtGui.QTableView() 
tableView.setModel(tableModel) 
tableView.setItemDelegate(Delegate()) 

for row in range(tableModel.rowCount()): 
    for column in range(tableModel.columnCount()): 
     index=tableModel.index(row, column) 
     tableView.openPersistentEditor(index) 

tableView.show() 
app.exec_() 

SPÄTER EDITED:

Vielen Dank Fabio für den Trick.

Arbeitscode wird unten veröffentlicht.

Anstatt die Wertzuweisung innerhalb der Delegate.createEditor() Methode zu verarbeiten, sollten wir stattdessen Delegate.setEditorData(editor, index) implementieren. Innerhalb von setEditorData können wir beide bekommen: index.column() und index.row() sowie self.items Variable nach Modell mit index Argumente value = index.model().items[row][column]

enter image description here

from PyQt4 import QtCore, QtGui 
app = QtGui.QApplication([]) 

class Delegate(QtGui.QItemDelegate): 
    def __init__(self): 
     QtGui.QItemDelegate.__init__(self) 

    def createEditor(self, parent, option, index): 
     if index.column()==0: 
      lineedit=QtGui.QLineEdit(parent) 
      return lineedit 

     elif index.column()==1: 
      combo=QtGui.QComboBox(parent) 
      return combo 

    def setEditorData(self, editor, index): 
     row = index.row() 
     column = index.column() 
     value = index.model().items[row][column] 
     if isinstance(editor, QtGui.QComboBox): 
      editor.addItems(['Somewhere','Over','The Rainbow']) 
      editor.setCurrentIndex(index.row()) 
     if isinstance(editor, QtGui.QLineEdit): 
      editor.setText('Somewhere over the rainbow') 

class Model(QtCore.QAbstractTableModel): 
    def __init__(self): 
     QtCore.QAbstractTableModel.__init__(self) 
     self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']] 

    def flags(self, index): 
     return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable 
    def rowCount(self, parent=QtCore.QModelIndex()): 
     return 3 
    def columnCount(self, parent=QtCore.QModelIndex()): 
     return 3 

    def data(self, index, role): 
     if not index.isValid(): return 
     row = index.row() 
     column = index.column() 
     if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole: 
      return self.items[row][column] 

tableModel=Model() 
tableView=QtGui.QTableView() 
tableView.setModel(tableModel) 
tableView.setItemDelegate(Delegate()) 

for row in range(tableModel.rowCount()): 
    for column in range(tableModel.columnCount()): 
     index=tableModel.index(row, column) 
     tableView.openPersistentEditor(index) 

tableView.show() 
app.exec_() 

Antwort

1

Der Artikel Delegierten festgelegt durch setEditorData Verfahren der Editor-Daten für den Zugriff auf, dass nimmt die Modelldaten und setzt sie in den Editor. In diesem Fall übernimmt der Elementdelegate die Modelldaten (die möglicherweise leer sind) und setzt sie auf QLineEdit, sodass eine leere Zeichenfolge festgelegt wird.

Wenn Sie die Daten im Editor initialisieren möchten, müssen Sie setEditorData neu implementieren oder die Daten in Ihrem Modell initialisieren.

Für QComboBox werden die Elemente korrekt angezeigt, da setEditorData die Elemente des Kombinationsfelds nicht ändert. Im Allgemeinen müssen Sie setEditorData neu implementieren, um den aktuellen Index des Kombinationsfelds abhängig von den Modelldaten festzulegen.

Ich empfehle, die Dokumentation zu lesen: Model/View Programming und Delegate Classes