Python 如何在PyQt中为Qt设计器小部件实现MousePressEvent

Python 如何在PyQt中为Qt设计器小部件实现MousePressEvent,python,pyqt4,qt-designer,Python,Pyqt4,Qt Designer,我有一个小部件(QTabeleWidget、QLabels和一些qbutton)。它是在Qt设计器中构建的,现在我必须实现一些东西。为此,我需要鼠标垫。 通常我会编写一个子类并编写如下内容: def mousePressEvent(self, event): if event.button() == Qt.LeftButton: print "left" else: print 'right' 但是我不知道如何在设计器中创建小部件。 我需要它来开

我有一个小部件(QTabeleWidget、QLabels和一些qbutton)。它是在Qt设计器中构建的,现在我必须实现一些东西。为此,我需要鼠标垫。 通常我会编写一个子类并编写如下内容:

def mousePressEvent(self, event):
    if event.button() == Qt.LeftButton:
        print "left"
    else:
        print 'right'
但是我不知道如何在设计器中创建小部件。 我需要它来开QTabeleWidget。希望有人能帮助我。我试图在谷歌的帮助下解决这个问题,但没有成功。
这个网站帮助了我很多次,所以我想我会尝试一下,然后问一下

使用PyQt,有三种不同的方式来处理在designer中创建的表单:

  • 使用单一继承并使表单成为成员变量
  • 使用多重继承
  • 直接从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')
    
    多重继承

    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')
    
    动态生成的

    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


    我建议你看一看电视。第13.2节讨论了
    uic
    模块。

    谢谢您的回答。我试过了,但没用。如果我点击窗口,而不是小部件,它就会触发。鼠标压力器工作正常。但是如果我点击QTableWidget或QLabel,mousePressEvent不会被执行。例如,如果我想从QTableWidget获得itemSelectionChanged信号,那么我会写:“def on_myTable_itemSelectionChanged(self):”因此我正在为mousePressEvent寻找等效的东西。希望我的解释不坏。自动接线存在于信号中,但不适用于事件。当您子类化并实现
    mousePressEvent
    时,您将接收给定小部件的事件,但仅接收子部件不接受事件的事件。由于小部件中有小部件,因此每个小部件都会在父部件看到事件之前接收和处理事件。当不存在相关信号时,一个很好的处理方法是使用
    installEventFilter
    安装事件过滤器。谢谢!它与installEventFilter一起工作。这就是我要找的。