Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt:单击X不';t触发器关闭事件_Python_Pyqt_Pyqt4 - Fatal编程技术网

Python PyQt:单击X不';t触发器关闭事件

Python PyQt:单击X不';t触发器关闭事件,python,pyqt,pyqt4,Python,Pyqt,Pyqt4,我是PyQt的新手,尝试开发简单的应用程序。我用Qt设计器设计了简单的ui。如果用户在单击X或、、退出“”按钮或从菜单中选择退出时确实要退出应用程序,我需要额外的确认 代码如下: import sys from PyQt4 import QtGui, QtCore, uic class MainWindow(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self)

我是PyQt的新手,尝试开发简单的应用程序。我用Qt设计器设计了简单的ui。如果用户在单击X或、、退出“”按钮或从菜单中选择退出时确实要退出应用程序,我需要额外的确认

代码如下:

import sys
from PyQt4 import QtGui, QtCore, uic

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.ui = uic.loadUi('main_window.ui')
        self.ui.show()

        self.ui.btnExit.clicked.connect(self.close)
        self.ui.actionExit.triggered.connect(self.close)

    def closeEvent(self, event):
        print("event")
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()


def main():
    app = QtGui.QApplication(sys.argv)
    win = MainWindow()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
问题在于:

  • 当我在主窗口上单击X时,closeEvent函数不会触发
  • 当我单击退出按钮或从菜单中选择、退出“”时,该功能将启动
    调用,但单击“是”不会关闭应用程序

我发现了一些关于SO的问题,并搜索了教程,但没有任何内容涵盖此类问题。我做错了什么?

请注意,您正在做:

self.ui = uic.loadUi('main_window.ui')
self.ui.show()
实际窗口是
win
中的一个实例属性(
ui
)。而不是
win
本身。而且它没有实现
closeEvent

可以在实例中加载
.ui
文件

PyQt4.uic.loadUi(uifile[, baseinstance=None[, package='']])
你应该用这个。这样,您的代码将是:

import sys
from PyQt4 import QtGui, QtCore, uic

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        uic.loadUi('main_window.ui', self)

        self.btnExit.clicked.connect(self.close)
        self.actionExit.triggered.connect(self.close)

    def closeEvent(self, event):
        print("event")
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()


def main():
    app = QtGui.QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
import sys
from PyQt4 import QtGui, QtCore, uic

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.ui = uic.loadUi('main_window.ui')
        self.ui.closeEvent = self.closeEvent
        self.ui.show()

        self.ui.btnExit.clicked.connect(self.close)
        self.ui.actionExit.triggered.connect(self.close)

    def closeEvent(self, event):
        print("event")
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()


def main():
    app = QtGui.QApplication(sys.argv)
    win = MainWindow()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

注意:我不喜欢在
\uuuu init\uuu
中显示窗口。显式更好。所以,我把它移到了
main
。您可以随意修改它。

在设计器中,您可以将事件连接到主窗口,并在设计器中为其添加新的插槽,然后只需在python中实现这些方法,事件->插槽连接将自动完成。

我可以使用它,只需添加这一行即可

self.ui.closeEvent = self.closeEvent
所以你的代码应该是:

import sys
from PyQt4 import QtGui, QtCore, uic

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        uic.loadUi('main_window.ui', self)

        self.btnExit.clicked.connect(self.close)
        self.actionExit.triggered.connect(self.close)

    def closeEvent(self, event):
        print("event")
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()


def main():
    app = QtGui.QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
import sys
from PyQt4 import QtGui, QtCore, uic

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.ui = uic.loadUi('main_window.ui')
        self.ui.closeEvent = self.closeEvent
        self.ui.show()

        self.ui.btnExit.clicked.connect(self.close)
        self.ui.actionExit.triggered.connect(self.close)

    def closeEvent(self, event):
        print("event")
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()


def main():
    app = QtGui.QApplication(sys.argv)
    win = MainWindow()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

另一个简单的解决方案是使用
app.aboutToQuit.connect(self.close\u事件)
在用户单击关闭按钮时运行
closeEvent
函数中的代码

此处的示例代码
非常感谢,这解决了我的两个问题。我知道我遗漏了一些非常简单的东西,但我发现的教程并没有涵盖这个主题。显式展示也是一个很好的解决方案,感谢您指出这一点。顺便问一下:你能推荐一些学习PyQt4的好资源吗?@Wookie88:我不知道很多教程。看起来不错。此外,官方的Qt文档到处都有使用示例。PyQt附带了很多示例。self.ui.closeEvent=self.closeEvent修复了我的问题。我知道这基本上是在移动一些函数地址,但除此之外,我完全不知道为什么会这样。但这是可行的。