2016-05-04 8 views
1

QTableViewにはQAbstractTableModelが割り当てられました。そしてItemDelegate(QItemDelegate)tableView.openPersistentEditorと割り当てられました。これで、tableViewがクリックされたときに、イベントはtableViewに完全に伝播しません(委任されたQLineEditorによってブロックされます)。Item delegate from blocking mousePressEvent

何が物事を成し遂げるために使用することができますQLineEdit's mousePressEvent event that is passed through the ItemDelegate to QTableViewのモデルwhen the tableView's item is clicked even while it is occupied by QItemInstance ? Is there any QItemDelegate`フラグを渡す方法だろうか?

コードは、モデルとデリゲートを持つ単一の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