pyqt对话框不显示第二个tim

2024-05-23 20:18:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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不再是{}。这很好,因为showAbout()中的条件允许我将对话框放在前面,而不是创建一个新的对话框(else条件)

但是,当对话框关闭时,self.about不再是{},这意味着它不会创建新的对话框,而是跳转到else条件

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

我考虑过重写AboutDialog类中的closeEvent方法,但我不确定如何获取对readingList的引用,以返回一条消息,说明对话框已关闭。或者我想得太多了,也许self.about.show()的返回可以用在什么地方?在

(我知道我可以使用模态对话框来避免所有这些,但我想试着弄清楚这一点)


Tags: selfnoneinitmaindefshowelseclass
1条回答
网友
1楼 · 发布于 2024-05-23 20:18:16

可能有几种方法可以做到这一点,但有一种可能:

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一起使用,因为在某些情况下,它可能导致无限递归。始终将子类作为第一个参数传入-除非您使用的是Python3,在这种情况下可以忽略所有参数)。在

相关问题 更多 >