PyQt应用程序关闭

2024-04-24 08:39:45 发布

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

我在使用PyQt创建窗口应用程序时遇到了一些问题。例如:我们有以下GUI类:

class SampleMainWindow(QtGui.QMainWindow):   
    def __init__(self, parent=None):
         ...

    def hideEvent(self, event):
        ...

    def showEvent(self, event):
        ...

    def activate(self):
        ...

    def closeEvent(self, event):
        ...

如果我们只想使用它来显示结果和acept用户输入,并且对于所有控制逻辑,我们有另一个类,它使用SampleMainWindow的实例作为字段:

class Programm:
    def __init__(self):
        self.window = SampleMainWindow()
        ....

app = QtGui.QApplication(sys.argv)
prog = Programm()
prog.window.show()
app.exec_()

因此,如果我们创建Programm的实例,应用程序将运行良好,但在关闭时,我们将得到一个错误,即python.exe进程无法正常完成。但如果SampleMainWindow的实例不是类的字段:

class Programm:
    def __init__(self):
        win = SampleMainWindow()
        ....

应用程序关闭良好。原因是什么?

下面是Gui类的完整版本:

class SampleMainWindow(QtGui.QMainWindow):

def initTray(self):
    self.icon = QtGui.QSystemTrayIcon()
    self.icon.setIcon(QtGui.QIcon('Tray.png'))
    self.icon.show()
    self.icon.activated.connect(self.activate)

def __init__(self, parent=None):
    QtGui.QMainWindow.__init__(self)
    moduleglobalconstants.APP_RUNNING = True
    self.initTray()
    self.newSession = True

    self.setGeometry(300, 300, 600, 400)
    self.setWindowTitle('Eye: Recently Added Lines')
    self.statusBar().showMessage('Ready')
    exitAction = QtGui.QAction(QtGui.QIcon('Exit.png')
            ,'Exit'
            ,self)

    exitAction.setShortcut('Ctrl+Q')
    exitAction.setStatusTip('Exit application')
    self.connect(exitAction
                ,QtCore.SIGNAL('triggered()')
                ,QtCore.SLOT('close()'))

    menubar = self.menuBar()
    fileMenu = menubar.addMenu('&File')
    fileMenu.addAction(exitAction)

    self.toolbar = self.addToolBar('Exit')
    self.toolbar.addAction(exitAction)

    self.textEdit = QtGui.QTextEdit()
    self.scrollPosition = self.textEdit.textCursor()
    self.textEdit.setReadOnly(True)
    self.setCentralWidget(self.textEdit)

def hideEvent(self, event):
    self.hidden = True
    self.setWindowFlags(QtCore.Qt.ToolTip)
    self.setVisible(False)

def showEvent(self, event):
    self.hidden = False
    self.setVisible(True)

def activate(self):

    self.setWindowFlags(QtCore.Qt.Window)
    self.show()
    self.setWindowState(self.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive)
    self.activateWindow()

def questionDialog(self, caption = 'Message',text = "Are you sure?"):
    self.activate()
    msgBox = QtGui.QMessageBox(self)
    msgBox.setWindowTitle("Eye")
    msgBox.setText(caption);
    msgBox.setInformativeText(text);
    msgBox.setStandardButtons(QtGui.QMessageBox.Yes| QtGui.QMessageBox.No);
    msgBox.setDefaultButton(QtGui.QMessageBox.Yes);
    return msgBox.exec_()

def criticalDialog(self,app, caption = 'Eye: Critical Error',text = "Impossible to continue working!"):
    self.activate()
    msgBox = QtGui.QMessageBox.critical(self,caption,text)
    moduleglobalconstants.APP_RUNNING = False

def closeEvent(self, event):
    reply = self.questionDialog()
    if reply == QtGui.QMessageBox.Yes:
        moduleglobalconstants.APP_RUNNING = False
        event.accept()
    else:
        event.ignore()

def showNewLines(self, singleLine = None, lines = None, mode='insert'):
    if (mode == 'rewrite'):
        self.textEdit.clear()
    if lines:
        for line in lines:
            self.textEdit.insertPlainText(line.strip() + "\n")
    elif singleLine:
        self.textEdit.insertPlainText(singleLine.strip()+"\n")

Tags: selfnoneeventtrueinitdefclassactivate