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

3
我有一个小部件(QTabeleWidget、QLabels和一些QButtons)。它是在Qt-Designer中构建的,现在我必须实现一些东西。为此,我需要mousePressEvent。 通常我会编写一个子类并编写类似以下内容的代码:
def mousePressEvent(self, event):
    if event.button() == Qt.LeftButton:
        print "left"
    else:
        print 'right'

但我不知道如何在设计器中创建的小部件中实现这一点。我需要为QTabeleWidget实现它。希望有人能帮助我。我尝试过通过谷歌解决问题,但没有成功。这个网站曾经多次帮助了我,所以我想试一试并提问。
1个回答

4

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

  1. 使用单一继承并将表单作为成员变量
  2. 使用多重继承
  3. 直接从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参考手册中的第13.1节。第13.2节介绍了uic模块。


谢谢您的回答。我尝试了,但它不起作用。 如果我点击窗口而不是小部件,则会触发。mousePressEvent有效。但是,如果我点击QTableWidget或QLabel,则无法执行mousePressEvent。 例如,如果我想从QTableWidget获得itemSelectionChanged信号,那么我会写: “def on_myTable_itemSelectionChanged(self):” 所以我正在寻找与mousePressEvent相当的东西。 希望我的解释不太糟糕。 - user427305
自动连接存在于信号中,但不存在于事件中。当您子类化并实现mousePressEvent时,您将接收到给定小部件的事件,但仅限于子项未接受事件的事件。由于您在小部件内部有其他小部件,因此每个小部件在父级看到它之前都会接收和处理该事件。当没有相关信号时,处理这种情况的一种好方法是使用installEventFilter安装事件过滤器。 - Kaleb Pederson
谢谢!使用installEventFilter可以解决问题。这正是我一直在寻找的。 - user427305

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