在PyQt4中,如何在不将QMainWindow置于最前面的情况下自动关闭QDialog(窃取焦点)?

时间:2018-11-07 16:04:23

标签: python pyqt pyqt4 qmainwindow qdialog

我有一个大型应用程序,可与另一个单独的应用程序结合使用,以与远程软件交互。我的应用程序将使用模式QDialog向操作员弹出警报。操作员可以确认警报并返回到正在执行的操作。

问题在于(由远程软件生成的)警报也可以由其他应用程序清除。发生这种情况时,模态QDialog将自动关闭。不幸的是,这导致我的应用程序的QMainWindow上升到顶部。因此,如果另一个应用程序窗口位于我的顶部并且清除了警报,则我的应用程序窗口将出现在另一个应用程序窗口上方。

我目前在Windows上运行,但将来也可能在Linux(Gnome)上运行。

我有一个例子来说明我的问题:

from PyQt4 import QtGui, QtCore

import time


class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.modalDialog = None

        centralWidget = QtGui.QWidget()
        layout = QtGui.QVBoxLayout(centralWidget)
        label = QtGui.QLabel('Main Window', self)
        layout.addWidget(label)

        self.setCentralWidget(centralWidget)


    def showDialog(self):
        self.modalDialog = ModalDialog(self)
        self.modalDialog.show()


    def closeDialog(self):
        if self.modalDialog != None:
            self.modalDialog.close()
            del self.modalDialog
            self.modalDialog = None


    def closeEvent(self, event):
        if self.modalDialog != None:
            self.modalDialog.close()
            del self.modalDialog
            self.modalDialog = None


class ModalDialog(QtGui.QDialog):
    def __init__(self, parent):
        QtGui.QDialog.__init__(self, parent)

        layout = QtGui.QVBoxLayout(self)

        label = QtGui.QLabel('Modal Dialog', self)
        layout.addWidget(label)


if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)


    window = MainWindow()
    window.show()

    window.showDialog()

    time.sleep(5)

    window.closeDialog()


    try:
        exitStatus = app.exec_()
        print '\n\nDone...  (%s)' % exitStatus
        sys.exit(exitStatus)
    except:
        pass

运行代码,然后在QMainWindow和QDialog顶部放置另一个应用程序/窗口。等待计时器自动关闭QDialog。

编辑1:

为清楚起见,在我的应用程序中,GUI在自己的线程中运行,该线程由后端线程产生。因此,演示代码未使用完全相同的设置。尽管如此,它仍然应该证明这个概念。

0 个答案:

没有答案