我有一个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()
的回报可以某种方式使用?
(我知道我可以使用模态对话框来避免所有这些,但是想要尝试解决这个问题)
答案 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 ,在这种情况下,您可以省略所有参数。)