2016-05-04 10 views
1

Der QTableView wurde QAbstractTableModel als Modell zugewiesen. Und ItemDelegate(QItemDelegate) wurde mit tableView.openPersistentEditor zugewiesen. Wenn jetzt auf tableView geklickt wird, wird das Ereignis nicht vollständig an die tableView weitergegeben (wird durch eine delegierte QLineEditor blockiert).So stoppen Sie den Elementdelegierten von der Blockierung mousePressEvent

Was wäre ein Weg sein, die QLineEdit's mouse event that is passed through the ItemDelegate to QTableView Modell when the tableView's item is clicked even while it is occupied by QItemInstance ? Is there any QItemDelegate` Fahnen zu übergeben, die verwendet werden können, um Dinge zu erledigen?

Der Code erstellt eine einzelne TabelleView mit Modell und Delegate. Das Ereignis, das durch Klicken auf die Spalte 0 oder Spalte 1 ausgelöst wird, wird nicht an den Eintrag des TableView weitergegeben, da das Element nicht ausgewählt ist.

Eine Zeile mit tableView.setSelectionBehavior(QtGui.QTableView.SelectRows) zu entfernen, behebt das Problem. Macht es?

enter image description here

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

class LineEdit(QtGui.QLineEdit): 
    def __init__(self, parent=None, total=20): 
     super(LineEdit, self).__init__(parent=parent) 

    def mousePressEvent(self, event): 
     print 'mousePressEvent', event 
     super(LineEdit, self).mousePressEvent(event) 

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

    def createEditor(self, parent, option, index): 
     if index.column()==0: 
      lineedit=LineEdit(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] 

def tableViewClicked(index): 
    print 'clicked: %s'%index 


tableModel=Model() 
tableView=QtGui.QTableView() 
tableView.setModel(tableModel) 
tableView.setItemDelegate(Delegate()) 
# tableView.setSelectionBehavior(QtGui.QTableView.SelectRows) 
tableView.clicked.connect(tableViewClicked) 

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

warum nicht ein Modell Objektzeiger in Ihrer Stellvertretung Elementen Funktion nutzen? B. das Signal Ihres Delegiertenelements an die Steckplätze des Modells anschließen oder die Funktion des Modells im Ereignishandler des Delegatenelements aufrufen?

+0

Der Aufruf der Funktion eines Modells im Ereignishandler des Delegatenelements funktioniert. Einige würden eine solche Lösung nicht mögen. – alphanumeric