【问题标题】:How to accept close event of MainWindow when loading it with QUiLoader()?使用 QUiLoader() 加载 MainWindow 时如何接受关闭事件?
【发布时间】:2015-05-12 02:31:38
【问题描述】:

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

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_())

【问题讨论】:

    标签: python qt pyside


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果我在设计 UI 文件时采用 Widget 形式而不是 MainWindow,并将 self.view.show() 替换为 self.show() 作为第一种方法,并在 show 上方添加 self.setCentralWidget(self.view) ()。然后我能够收到关闭事件。但不知道怎么做?
    • @pythonlearner。因为您显示的是self 而不是self.view,并且self 已为它定义了closeEvent
    • 但如果我在帖子的第一种方法中执行 self.show(),它会显示一个空的 UI,这就是我使用 self.view.show() 的原因
    • 所以我怀疑将 UI 文件中的 QMainWindow 更改为 QWidget 是如何允许我使用 self.view() 显示 UI 的?
    • @pythonlearner。您可能需要查看 PySide 如何实现其QUiLoader 类。出于某种原因,它对QMainWindowQDialog 的处理方式不同。如果load 的第二个参数是这些类之一的实例,它将成为返回的小部件的。不过,我不知道这是否是真正的意图 - 你必须询问 PySide 开发人员。也许这是一个错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    相关资源
    最近更新 更多