pyqt对话框未显示第二次

时间:2016-08-20 13:29:27

标签: python qt pyqt pyqt4

我有一个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,这意味着它不会创建新的对象而只是跳转到其他条件

我怎样才能在第一个之后创建对话框?

我考虑过覆盖closeEvent类中的AboutDialog方法,但我不确定如何获取对readingList的引用以发回消息说对话框已关闭。或者也许我正在过度思考它,也许self.about.show()的回报可以某种方式使用?

(我知道我可以使用模态对话框来避免所有这些,但是想要尝试解决这个问题)

1 个答案:

答案 0 :(得分: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)

(注意:你永远不要将self.__class__super一起使用,因为它可能会在某些情况下导致无限递归。总是传入子类作为第一个参数 - 除非你使用的是Python 3 ,在这种情况下,您可以省略所有参数。)