【问题标题】:How to pass mousePressEvent from QItemDelegate to QTableView如何将 mousePressEvent 从 QItemDelegate 传递给 QTableView
【发布时间】:2016-09-02 15:16:56
【问题描述】:

代码创建了一个 QTableView。左列预先填充了 QLineEdits 代表。右列未填充任何代表。

当左列的委托 QLineEdit 被点击时,'clicked' 信号被委托项目阻止并且 tableView“单元格”永远不会被选中。

对于要选择的 tableView 项目,mousePressEvent 应该能够一直通过委托项目到达 tableView。除第 0 行外,其他所有索引行均未选择。如何使其适用于所有模型索引?

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

user1034749 发布的解决方案:

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

【问题讨论】:

    标签: python qt pyqt qtableview qitemdelegate


    【解决方案1】:

    要通过事件,您只需忽略它,如下所示:

     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 的单元格。请展示如何在不做奇怪事情的情况下实现它。
    • 我在原始问题的“其他人提出的建议”部分下发布了您的解决方案。你的方法有效。但它选择 tableView 行错误。
    • 点击委托项永远不会错过delegateds mousePressEvent方法。这太棒了!但是偶尔单击委派项目单元格不会选择 tableView 行(要复制它:通过单击 tableView 中的空白区域取消选择所有 tableView 的行。然后单击上次单击的相同委派项目。onClick方法打印出它得到了一个事件。但该行仍然被取消选择。)。如何确保每次点击委托项目时都选择表格行?
    • mouseReleaseEvent 中加入一行tableView.selectRow(0) 修复了选择问题。
    • .selectRow(0) 解决方案不适用于 Ctrl 或 Shift 键修改
    猜你喜欢
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 2017-11-24
    • 2017-05-16
    相关资源
    最近更新 更多