使用 QUiLoader() 加载时如何接受 MainWindow 的关闭事件?
How to accept close event of MainWindow when loading it with QUiLoader()?
如何在以下代码中接收关闭事件?
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 中顶级 class 的子class。相比之下,第一个示例使用组合而不是 subclassing,后者将所有 gui 元素放在一个内部命名空间中。 Main
class 只是一个容器,充当 view
小部件的父级,并且从未实际显示(这反过来意味着它不会收到任何关闭事件)。
在 PyQt 中,uic
模块有几个功能可以让您解决这些问题,但目前在 PySide 中没有类似的功能。相反,您必须推出自己的功能。有关如何执行此操作的说明,请参阅 this answer。
或者,您可以将 Qt Designer 中的顶级 class 更改为 QWidget
,然后使 view
成为 Main
class。不过,这比上面的方法要灵活得多。
如何在以下代码中接收关闭事件?
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 中顶级 class 的子class。相比之下,第一个示例使用组合而不是 subclassing,后者将所有 gui 元素放在一个内部命名空间中。 Main
class 只是一个容器,充当 view
小部件的父级,并且从未实际显示(这反过来意味着它不会收到任何关闭事件)。
在 PyQt 中,uic
模块有几个功能可以让您解决这些问题,但目前在 PySide 中没有类似的功能。相反,您必须推出自己的功能。有关如何执行此操作的说明,请参阅 this answer。
或者,您可以将 Qt Designer 中的顶级 class 更改为 QWidget
,然后使 view
成为 Main
class。不过,这比上面的方法要灵活得多。