如何在以下代码中接收关闭事件?
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
类的中央窗口小部件。但是,这比上面的方法灵活得多。