如何在 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 中为 QGridLayout 添加拉伸?