Python 如何在使用QUiLoader()加载MainWindow时接受其关闭事件?

Python 如何在使用QUiLoader()加载MainWindow时接受其关闭事件?,python,qt,pyside,Python,Qt,Pyside,如何在以下代码中接收关闭事件 class Main(QMainWindow): def __init__(self, parent=None): super(Main, self).__init__(parent) self.view = QUiLoader().load("sample.ui", self) self.view.show() def closeEvent(self, e): print "clos

如何在以下代码中接收关闭事件

class Main(QMainWindow):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.view = QUiLoader().load("sample.ui", self)
        self.view.show()

    def closeEvent(self, e):
        print "close event recieved"

def main():
    app = QApplication(sys.argv)
    a=Main()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()
若我使用pyside uic将sample.ui转换为sample.py并将其导入main.py,那个么我就能够收到close事件

from sample import Ui_MainWindow

class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.setupUi(self)

    def closeEvent(self, e):
        print "close event recieved"

app = QApplication(sys.argv)
a=Main()
a.show()
sys.exit(app.exec_())

第二个示例之所以有效,是因为它实际上成为了Qt设计器顶级类的一个子类。相比之下,第一个示例使用组合而不是子类化,这将所有gui元素放在一个内部名称空间中。主类只是一个容器,充当视图小部件的父级,并且从未实际显示,这意味着它不会接收任何关闭事件

在PyQt中,uic模块有几个功能,允许您解决这些问题,但目前在PySide中没有类似的功能。相反,您必须滚动自己的函数。有关如何执行此操作的说明,请参见


或者,您可以将Qt设计器中的顶级类更改为QWidget,然后使view成为主类的中心小部件。但是,与上述方法相比,这种方法的灵活性要小得多。

第二个示例之所以有效,是因为它实际上成为了Qt Designer顶级类的一个子类。相比之下,第一个示例使用组合而不是子类化,这将所有gui元素放在一个内部名称空间中。主类只是一个容器,充当视图小部件的父级,并且从未实际显示,这意味着它不会接收任何关闭事件

在PyQt中,uic模块有几个功能,允许您解决这些问题,但目前在PySide中没有类似的功能。相反,您必须滚动自己的函数。有关如何执行此操作的说明,请参见


或者,您可以将Qt设计器中的顶级类更改为QWidget,然后使view成为主类的中心小部件。但是,如果我在设计UI文件时采用小部件形式而不是主窗口,并将第一个方法的self.view.show替换为self.show,并将self.setCentralWidgetself.view添加到show上方,那么这比上述方法的灵活性要小得多。

。然后我就可以接收关闭事件。但我不知道怎么做?@pythonlearner。因为您显示的是self而不是self.view,并且self已经为其定义了closeEvent。但是如果我在帖子的第一个方法中执行self.show,它会显示一个空的UI,而我使用self.view.show时它会显示一个空的UI。所以我的疑问是,将UI文件中的QMainWindow更改为QWidget如何允许我使用self.view?@pythonlearner显示UI。您可能需要了解PySide如何实现其QUiLoader类。出于某种原因,它对QMainWindow和QDialog的处理方式有所不同。如果要加载的第二个参数是其中一个类的实例,它将成为返回小部件的父级。我不知道这是否是真正的意图,但是-你必须询问PySide开发人员。也许这是一个bug?如果我在设计UI文件时采用小部件形式而不是主窗口,并将self.view.show替换为self.show作为第一个方法,并将self.setCentralWidgetself.view添加到show上方。然后我就可以接收关闭事件。但我不知道怎么做?@pythonlearner。因为您显示的是self而不是self.view,并且self已经为其定义了closeEvent。但是如果我在帖子的第一个方法中执行self.show,它会显示一个空的UI,而我使用self.view.show时它会显示一个空的UI。所以我的疑问是,将UI文件中的QMainWindow更改为QWidget如何允许我使用self.view?@pythonlearner显示UI。您可能需要了解PySide如何实现其QUiLoader类。出于某种原因,它对QMainWindow和QDialog的处理方式有所不同。如果要加载的第二个参数是其中一个类的实例,它将成为返回小部件的父级。我不知道这是否是真正的意图,但是-你必须询问PySide开发人员。也许是虫子?