如何将QItemDelegate的mousePressEvent传递给QTableView

4
该代码创建了一个单独的QTableView。左列预先填充了QLineEdits委托。右列没有填充任何委托。
当左列的QLineEdit被委托点击时,“clicked”信号被委托项目阻止,tableView“cell”永远不会被选中。
为了选择tableView项目,mousePressEvent应该能够通过委托项到达tableView。除了第0行以外,所有其他行的索引都不被选中。如何使其对所有模型索引起作用?

enter image description here

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

class LineEdit(QTextEdit):
    def __init__(self, parent=None):
        super(LineEdit, self).__init__(parent)
    def mousePressEvent(self, event):
        tableView = self.parent().parent()
        tableView.mousePressEvent(event)

class Delegate(QItemDelegate):
    def createEditor(self, parent, option, index):
        return LineEdit(parent)

def onClick(index):
    print 'tableView.onClick:', index

tableView = QTableView()
tableView.setModel(QStandardItemModel(4, 2))
tableView.clicked.connect(onClick)
tableView.setItemDelegate(Delegate())

for row in range(4):
    tableView.openPersistentEditor(tableView.model().index(row, 0))

tableView.show()
app.exec_()

用户1034749发布的解决方案:

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

class LineEdit(QTextEdit):
    def __init__(self, parent=None):
        super(LineEdit, self).__init__(parent)

    def mouseReleaseEvent(self, event):
        super(LineEdit, self).mouseReleaseEvent(event)
        table = self.parent().parent() # added by me here
        tableView.selectRow(0) # to fix the issue with tableView row not getting selected on delegated click.
        event.ignore()

    def mousePressEvent(self, event):
        super(LineEdit, self).mousePressEvent(event)
        event.ignore()

class Delegate(QItemDelegate):
    def createEditor(self, parent, option, index):
        return LineEdit(parent)

def onClick(index):
    print 'tableView.onClick:', index
    selectedIndexes = tableView.selectionModel().selectedRows()

tableView = QTableView()
tableView.setSelectionBehavior(QTableView.SelectRows)
tableView.setModel(QStandardItemModel(4, 2))
tableView.clicked.connect(onClick)
tableView.setItemDelegate(Delegate())

for row in range(4):
    tableView.openPersistentEditor(tableView.model().index(row, 0))

tableView.show()
app.exec_()
1个回答

3

要通过事件,你只需要忽略它,就像这样:

 def mouseReleaseEvent(self, event):
        print "mouse release"
        super(LineEdit, self).mouseReleaseEvent(event)
        event.ignore()

 def mousePressEvent(self, event):
        print "mouse press"
        super(LineEdit, self).mousePressEvent(event)
        event.ignore()

我想要的只是确保当您单击由QLineEdit单元格(左列)委托的tableView单元格时,该单元格被选中。请展示如何实现它,而不需要做奇怪的事情。 - alphanumeric
我已经在我的原始问题下的“其他人提出的建议”部分发布了您的解决方案。您的方法是有效的,但它选择了错误的tableView行。 - alphanumeric
点击委托项永远不会错过委托的mousePressEvent方法。这很好!但是偶尔点击委托项单元格不会选择tableView行(要复制它:通过单击tableView中的空白区域取消选择所有tableView的行。然后再次单击上次单击的相同委托项。onClick方法打印出它收到了一个事件。但是该行仍然未被选中)。如何确保每次单击委托项时都选择表行? - alphanumeric
mouseReleaseEvent 中加入一行代码 tableView.selectRow(0) 可以解决选择问题。 - alphanumeric
.selectRow(0) 解决方案无法与 Ctrl 或 Shift 键修改一起使用。 - alphanumeric
@spootnx 你可以重新实现 QApplication.notify 来捕获所有事件,发送给任何对象,并找出谁偶尔“吃掉”了你的事件。 - fghj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接