2016-05-04 2 views
1

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). Имеет ли это?

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

ответ

1

почему бы не использовать указатель на объект модели в функции делегата элемента? например, подключить сигнал вашего элемента делегата к слотам модели или вызвать функцию модели в обработчике событий вашего делегата?

+0

Вызов функции модели в обработчике события элемента делегата будет работать. Некоторым не понравилось бы такое решение ты. – alphanumeric

Смежные вопросы