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?
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_()
Der Aufruf der Funktion eines Modells im Ereignishandler des Delegatenelements funktioniert. Einige würden eine solche Lösung nicht mögen. – alphanumeric