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

2024-05-14 00:49:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我已经看到了很多关于如何做到这一点的例子,但是它们都需要在GUI模块中编辑代码。我进口我的图形用户界面.py文件由pyuic5创建到我的主脚本中,在这里我可以连接到按钮、行编辑等。。我这样做是为了在任何时候都可以用Qt设计器更新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()

Tags: 模块文件pytest脚本uimainsys
2条回答

如果您的设计中有一个特定的“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

您应该从导入的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()

相关问题 更多 >