我是Python和PyQt的新手。我试图管理closeEvent,然后才关闭mainwindow,但这只能从“X”按钮开始。从创建的QMEssageBox询问用户,callEvent()被调用两次。
这是代码的相关部分:
+----------+------------+
| DateKey | stockValue |
+----------+------------+
| 20160131 | 4 |
| 20160331 | 4 |
+----------+------------+
'actionChiudi'是主要人物中的menù项目。 根据我的理解,当使用'X'按钮时,函数close()只能直接从mainwindow对象调用一次,然后关闭我的应用程序。 当使用menù项时,该函数创建新对象'QMessageBox',然后为该对象调用'closeEvent()'一次,然后调用mainwindow对象的相同函数。如果这是正确的,我不知道如何管理这个。 在此先感谢您的帮助!
答案 0 :(得分:0)
感谢您提供有关如何构建良好代码示例的提示。对不起,但我是那里的新人,然后我没有成功地做出一个好榜样。但是,与此同时,我正在考虑这个问题,最后,我用一个小技巧解决了这个问题。
我添加了一个全局变量,如果你正在关闭主窗口,那么在其他调用closeEvent()时会避免调用测试过程。 我曾尝试创建一个类来生成主类外部的QMessageBox,然后重写此对象的closeEvent(),但不起作用。我发现的唯一方法是使用全局变量。程序继续调用两次closeEvent(一个用于QMessageBox,一个用于主窗口),但现在,第二次忽略调用测试。这是一个技巧,它并不优雅,但它对我有用。
现在的代码是:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import sys
import os
import datetime
import inspect
import csv
import codecs
import pymssql
from PyQt4 import QtGui, QtCore, Qt
import mainwindow
#import _winreg only on Microsoft platforms
import platform
winos = True
if os.name == 'nt' and platform.system() == 'Windows':
import _winreg
#other stuff needed under Windows
import _mssql
import decimal
import uuid
winos = True
else:
winos = False
#other global variables
liccode = False
closemain = False
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
super(MainWindow, self).__init__(parent)
self.ui = mainwindow.Ui_MainWindow()
self.ui.setupUi(self)
# some stuff and widgets to visualize in the main window
#connettors to menù functions; leave only the closing one
self.ui.actionChiudi.triggered.connect(self.close)
#override of closeEvent - there I think, it's better to work to separate
#closeEvent for mainwindow from general closeEvent. But how?
def closeEvent(self, event):
global closemain
#make evaluation test to decide how to work. Close directly or no?
if self.csvViewer.rowCount() > 0 and not closemain:
print event
#show a warning
Error = QtGui.QMessageBox()
Error.setIcon(QtGui.QMessageBox.Question)
Error.setWindowTitle('WARNING !!')
Error.setInformativeText(u"Are you sure to leave?")
Error.setStandardButtons(QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel)
ret = Error.exec_()
if ret == QtGui.QMessageBox.Ok:
closemain = True
event.accept()
else:
event.ignore()
else:
#close directly
event.accept()
#start application and create main
app = QtGui.QApplication(sys.argv)
my_mainWindow = MainWindow()
my_mainWindow.show()
sys.exit(app.exec_())
在任何情况下,任何建议都被广泛接受,以制作更好的代码。谢谢大家!