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

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,则可以接收关闭事件。

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 Designer顶级类的子类。相比之下,第一个示例使用组合而不是子类化,这将所有gui元素放入内部名称空间中。 Main类只是充当view小部件的父级的容器,并且从不实际显示(这反过来意味着它不接收任何关闭事件)。

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

或者,您可以将Qt Designer中的顶级类更改为QWidget,然后将view设置为Main类的中央窗口小部件。但是,这比上面的方法灵活得多。

09-25 21:40