我有一个大型应用程序,可与另一个单独的应用程序结合使用,以与远程软件交互。我的应用程序将使用模式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在自己的线程中运行,该线程由后端线程产生。因此,演示代码未使用完全相同的设置。尽管如此,它仍然应该证明这个概念。