В PyQt4, как я могу автоматически закрыть QDialog, не выводя QMainWindow на передний план (крадет фокус)? - PullRequest
0 голосов
/ 07 ноября 2018

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

...