Python和PyQt:在退出确认框callEvent()上,它被调用了两次

时间:2017-05-10 13:13:00

标签: python qt pyqt

我是Python和PyQt的新手。我试图管理closeEvent,然后才关闭mainwindow,但这只能从“X”按钮开始。从创建的QMEssageBox询问用户,callEvent()被调用两次。

这是代码的相关部分:

+----------+------------+
| DateKey  | stockValue |
+----------+------------+
| 20160131 |          4 |
| 20160331 |          4 |
+----------+------------+

'actionChiudi'是主要人物中的menù项目。 根据我的理解,当使用'X'按钮时,函数close()只能直接从mainwindow对象调用一次,然后关闭我的应用程序。 当使用menù项时,该函数创建新对象'QMessageBox',然后为该对象调用'closeEvent()'一次,然后调用mainwindow对象的相同函数。如果这是正确的,我不知道如何管理这个。 在此先感谢您的帮助!

1 个答案:

答案 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_())

在任何情况下,任何建议都被广泛接受,以制作更好的代码。谢谢大家!