У меня есть большое приложение, которое работает вместе с другим отдельным приложением для взаимодействия с удаленным программным обеспечением. В моем приложении всплывают оповещения оператору с использованием модального 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 работает в своем собственном потоке, который создается внутренним потоком. Таким образом, демонстрационный код не использует точно такую же настройку. Это все еще должно продемонстрировать концепцию.