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