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

时间:2015-01-24 16:38:33

标签: 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 "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_())

1 个答案:

答案 0 :(得分:4)

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

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

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