【问题标题】:PyQt5 Interrupt Close Event from Outside the Main Gui Module来自主 Gui 模块外部的 PyQt5 中断关闭事件
【发布时间】:2016-11-16 15:14:01
【问题描述】:

我使用 Qt Designer 构建我的 GUI,并使用 pyuic5 将它们转换为 py 文件。我的最终目标是在变量 == 1 时中断用户关闭程序并向他们显示“您确定要关闭吗?”类型对话框。如果所述变量 == 0 则正常关闭程序即可。

我已经看到很多关于如何做到这一点的示例,但所有这些示例都需要在 GUI 模块中编辑代码。我将 pyuic5 创建的 gui.py 文件导入到我的主脚本中,在那里我完成了与按钮、行编辑等的所有连接。我这样做是为了随时可以使用 Qt Designer 更新 GUI 而不会影响程序功能.

有没有办法从我的从 Qt Designer 导入 GUI 模块的主脚本执行此操作?

我的主脚本的结构示例:

import philipsControlGui
import sys

def main():
    MainWindow.show()
    sys.exit(app.exec_())

def test():
    print('test')

# Main window setup
app = philipsControlGui.QtWidgets.QApplication(sys.argv)
MainWindow = philipsControlGui.QtWidgets.QMainWindow()
ui = philipsControlGui.Ui_MainWindow()
ui.setupUi(MainWindow)

# Main window bindings
ui.onButton.clicked.connect(test)
### Can I insert something here to do: if user closes the window... do something else instead?

if __name__ == "__main__":
    main()

【问题讨论】:

  • 您需要重写 closeEvent 方法(正如您可能已经从大量示例中知道的那样)。我不知道你是否可以在 Qt Designer 中做到这一点。

标签: python qt python-3.x pyqt pyqt5


【解决方案1】:

您应该从导入的 gui 创建一个子类,以便重新实现 closeEvent 方法:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from philipsControlGui import Ui_MainWindow

class MainWindow(QtWidgets.QMainWindow):    
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setUpUi(self)
        self.ui.onButton.clicked.connect(self.test)
        self._check_close = True

    def test(self):
        print('test')
        self._check_close = not self._check_close

    def closeEvent(self, event):
        if self._check_close:
            result = QtWidgets.QMessageBox.question(
                self, 'Confirm Close', 'Are you sure you want to close?',
                QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
            if result == QtWidgets.QMessageBox.Yes:
                event.accept()
            else:
                event.ignore()

def main():
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':

    main()

【讨论】:

    【解决方案2】:

    如果您的设计中有一个特定的“退出按钮”,您应该能够在主代码中连接它并创建一个弹出对话框。您必须导入 QtCore/QtGui 组件。我总是直接编写我的 GUI(QtDesigner 在这些事情上很痛苦)所以我假设是这样的:

     from PyQt4.QtGui import *
     from PyQt4.QtCore import *
    
    [YOUR CODE]
    
    ui.ExitButton.clicked.connect(Exit)
    
    def Exit():
    
      msg = QMessageBox()
      msg.setIcon(QMessageBox.Information)
    
      msg.setText("Are you sure you want to close this window?")
      msg.setWindowTitle("MessageBox demo")
      msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
      msg.buttonClicked.connect(msgbtn)
      retval = msg.exec_()
      print "value of pressed message box button:", retval
    

    【讨论】:

    • 谢谢。我确实有一个可以通过这种方式连接的退出操作项,但是如果用户使用窗口框架上的“X”按钮,我将如何确保相同的结果?
    • 有一个可以控制的主窗口CloseEvent。看看这个:stackoverflow.com/questions/22460003/…
    • 另一种确保用户不这样做的万无一失的方法是使用 - mainWindow.showFullScreen() 使您的 GUI 全屏显示
    猜你喜欢
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多