QTableView
был назначен QAbstractTableModel
в качестве модели. И ItemDelegate(QItemDelegate)
был назначен с tableView.openPersistentEditor
. Теперь, когда щелкнет tableView, событие не распространяется полностью на tableView (оно блокируется делегированным QLineEditor
).Как остановить элемент Делегат от блокировки mousePressEvent
Что бы способ передать модель when the tableView's item is clicked even while it is occupied by
QItemInstance ? Is there any
QItemDelegate` флаги QLineEdit's
mousePressEvent event that is passed through the
ItemDelegate to
QTableView, которые могут быть использованы, чтобы получить вещи сделать?
Код создает единый tableView с моделью и делегатом. Событие, вызванное нажатием столбца 0 или столбца 1, не распространяется на элемент tableView, так как элемент остается выбранным.
Исключить проблему с помощью tableView.setSelectionBehavior(QtGui.QTableView.SelectRows)
. Имеет ли это?
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_()
Вызов функции модели в обработчике события элемента делегата будет работать. Некоторым не понравилось бы такое решение ты. – alphanumeric