如何在 PyQt 中为 Qt-Designer 小部件实现 MousePressEvent

Posted

技术标签:

【中文标题】如何在 PyQt 中为 Qt-Designer 小部件实现 MousePressEvent【英文标题】:How to implement MousePressEvent for a Qt-Designer Widget in PyQt 【发布时间】:2010-08-21 21:38:03 【问题描述】:

我有一个小部件(QTabeleWidget、QLabels 和一些 QButtons)。它是在 Qt-Designer 中构建的,现在我必须实现一些东西。为此,我需要 mousePressEvent。 通常我会写一个子类并写这样的东西:

def mousePressEvent(self, event):
    if event.button() == Qt.LeftButton:
        print "left"
    else:
        print 'right'

但我不知道如何为在设计器中创建的小部件执行此操作。 我需要它用于 QTabeleWidget。希望可以有人帮帮我。我试图在谷歌的帮助下解决这个问题,但没有成功。 这个网站帮助了我很多次,所以我想我会试一试并询问。

【问题讨论】:

【参考方案1】:

使用 PyQt,可以通过三种不同的方式处理在设计器中创建的表单:

    使用单继承并使表单成为成员变量 使用多重继承 直接从 UI 文件动态生成成员

单一继承

class MyTableWidget(QTableWidget):
    def __init__(self, parent, *args):
        super(MyTableWidget, self).__init__(parent, args)
        self.ui = YourFormName()
        self.ui.setupUi(self)
        # all gui elements are now accessed through self.ui
    def mousePressEvent(self, event):
        pass # do something useful

多重继承

class MyTableWidget(QTableWidget, YourFormName):
    def __init__(self, parent, *args):
        super(MyTableWidget, self).__init__(parent, args)
        self.setupUi(self)
        # self now has all members you defined in the form
    def mousePressEvent(self, event):
        pass # do something useful

动态生成

from PyQt4 import uic
yourFormTypeInstance = uic.loadUi('/path/to/your/file.ui')

对于上面的 (3),您最终会得到您为表单指定的任何基本类型的实例。然后,您可以根据需要覆盖您的 mousePressEvent

我建议您查看PyQt4 reference manual 中的section 13.1。 13.2 节讨论了uic 模块。

【讨论】:

感谢您的回答。我试过了,但它不起作用。如果我单击窗口而不是小部件,则会触发。 mousePressEvent 有效。但是,如果我单击 QTableWidget 或 QLabel,则不会执行 mousePressEvent。例如,如果我想要来自 QTableWidget 的 itemSelectionChanged 信号,那么我写:“def on_myTable_itemSelectionChanged(self):” 所以我正在寻找与 mousePressEvent 等效的东西。希望我的解释还不错。 信号自动连接,但事件没有。当您子类化并实现mousePressEvent 时,您将收到给定小部件的事件,但仅限于子级不接受该事件的事件。由于您在小部件中有小部件,因此它们中的每一个都在父级看到它之前接收并处理事件。当没有相关信号存在时,一种处理该问题的好方法是使用installEventFilter 安装事件过滤器。 谢谢!它适用于 installEventFilter。这就是我一直在寻找的。​​span>

以上是关于如何在 PyQt 中为 Qt-Designer 小部件实现 MousePressEvent的主要内容,如果未能解决你的问题,请参考以下文章

如何在pyqt5中为一个小部件制作一个清晰的板子功能

如何在 PyQt5 中为 QGridLayout 添加拉伸?

如何在 Qt-Designer 中使用自定义小部件

使用 PySide2 在 Qt-Designer 中嵌入 PyQtGraph

如何在python pyqt5中从主窗口管理第二个窗口

PyQt:如何在一个类中为其他类“全局化”def?