диалог pyqt не отображается во второй раз

python qt pyqt pyqt4

149 просмотра

1 ответ

У меня есть приложение pyqt, в котором я хочу, чтобы при нажатии элемента меню отображалось диалоговое окно. Если диалоговое окно теряет фокус и элемент меню снова нажимается, диалоговое окно выводится на передний план. Пока все работает нормально.

Проблема в том, что когда диалоговое окно открывается, а затем закрывается, нажатие на элемент меню не создает / отображает новое диалоговое окно. Я думаю, что знаю почему, но не могу найти решение

Вот код:

from ui import mainWindow, aboutDialog

class ReadingList(QtGui.QMainWindow, mainWindow.Ui_MainWindow):
    def __init__(self):
        super(self.__class__, self).__init__()

        self.setupUi(self)

        self.about = None

        self.actionAbout.triggered.connect(self.showAbout)

    def showAbout(self):
        # If the about dialog does not exist, create one
        if self.about is None:
            self.about = AboutDialog(self)
            self.about.show()
        # If about dialog exists, bring it to the front
        else:
            self.about.activateWindow()
            self.about.raise_()

class AboutDialog(QtGui.QDialog, aboutDialog.Ui_Dialog):
    def __init__(self, parent=None):
        super(self.__class__, self).__init__()
        self.setupUi(self)

def main():
    app = QtGui.QApplication(sys.argv)
    readingList = ReadingList()
    readingList.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Проблема заключается в том, что когда диалог создается первый раз, self.aboutего уже нет None. Это хорошо, потому что условный showAbout()вход позволяет мне выводить диалог на передний план вместо создания нового (условие else)

Однако, когда диалоговое окно закрыто, self.aboutэто больше не Noneсвязано с созданием предыдущего диалога, что означает, что оно не создает новое, а просто переходит к условию else

Как сделать так, чтобы диалоги создавались после первого?

Я думал о переопределении closeEventметода в AboutDialogклассе, но я не уверен, как получить ссылку readingListдля отправки сообщения о том, что диалог был закрыт. Или, может быть, я обдумываю это, может быть, возвращение из self.about.show()может быть использовано как-то?

(Я знаю, что могу избежать всего этого, используя модальные диалоги, но хочу попытаться это выяснить)

Автор: Simon Источник Размещён: 08.11.2019 11:22

Ответы (1)


0 плюса

Решение

Вероятно, есть несколько способов сделать это, но есть одна возможность:

class ReadingList(QtGui.QMainWindow, mainWindow.Ui_MainWindow):
    def __init__(self):
        super(ReadingList, self).__init__()
        self.setupUi(self)    
        self.actionAbout.triggered.connect(self.showAbout)
        self.about = None

    def showAbout(self):
        if self.about is None:
            self.about = AboutDialog(self)
            self.about.show()
            self.about.finished.connect(
                lambda: setattr(self, 'about', None))
        else:
            self.about.activateWindow()
            self.about.raise_()

class AboutDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        super(AboutDialog, self).__init__(parent)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

(NB: вы никогда не должны использовать self.__class__с, superпоскольку это может привести к бесконечной рекурсии при определенных обстоятельствах. Всегда передавайте подкласс в качестве первого аргумента - если вы не используете Python 3, в этом случае вы можете опустить все аргументы).

Автор: ekhumoro Размещён: 20.08.2016 04:41
Вопросы из категории :
32x32