PyQt5 - 无法在子类中捕获 mousePressEvent

Posted

技术标签:

【中文标题】PyQt5 - 无法在子类中捕获 mousePressEvent【英文标题】:PyQt5 - Unable to capture mousePressEvent in subclass 【发布时间】:2017-02-23 15:22:07 【问题描述】:

我是 PyQt 的新手,在设置信号/插槽时遇到问题。

我有一个QTreeView 小部件,它的父小部件是QTabWidget,它本身位于QWidget 内,其节点是一个自定义对象Node,它继承自QWidget

我想启用对节点的点击,以触发 - 通过信号/插槽 - 伴随 QTableView 中的模型数据发生变化。

此处显示Node 中的初始化程序和覆盖mousePressEvent()

class Node(QtWidgets.QWidget):                                               
     def __init__(self, name, parent=None):                                    
         super(Node, self).__init__(parent)                                     
         self._name = name                                                    
         self._children = []                                                    
         self._parent = parent                                                 

         if parent is not None:                                                
             parent.addChild(self)                                               

     trigger = QtCore.pyqtSignal(int, int)                                      

     def mousePressEvent(self, event):                                          
         event.accept()                                                          
         print("Node clicked!")
         self.trigger.emit() # this would have variables...

单击树中的Node 项时未捕获鼠标事件。

我确定这与我设置小部件的方式和/或mousePressEvent() 的工作方式有关,但我整天都在努力解决这个问题,但没有任何乐趣。

【问题讨论】:

【参考方案1】:

我在这里走错了路。访问用户定义的QTreeView 项的正确方法是使用QModelIndex.internalPointer() 方法和QAbstractItemView.clicked() 信号。

例如。

self.selectionTree.clicked.connect(self.get_single_return_data)

# ...

def get_single_return_data(self, index):
    print("Signal triggered", index.internalPointer())
    p = index.internalPointer()
    # do something with p

【讨论】:

以上是关于PyQt5 - 无法在子类中捕获 mousePressEvent的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5:添加lineEdit的子类QSlider(用于在QtDesigner中提升)?

PyQt5:如何在 QThread 和某些子类之间“通信”?

在 PyQt5 中将参数传递给 QThread 子类时出错

PyQt5 制作子类小部件

PyQt5 中不存在声子类

从子类 PyQT5 调用父类