来自主Gui模块外部的PyQt5中断关闭事件

时间:2016-11-16 15:14:02

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

我使用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()

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:-1)

如果您的设计中有特定的“ExitButton”,您应该能够在主代码中连接它并创建一个弹出对话框。您必须导入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