2016-08-20 8 views
1

私はメニュー項目をクリックするとダイアログが表示されるpyqtアプリケーションを持っています。ダイアログがフォーカスを失ってメニュー項目が再びクリックされると、ダイアログが前面に表示されます。今のところうまくいきます。pyqtダイアログにもう一度表示されません

問題は、ダイアログを開いた後閉じたときに、メニュー項目をクリックしても新しいダイアログが作成または表示されないということです。私はなぜ知っていると思いますが、解決策

を把握することはできませんHERESにコード:

問題は、ダイアログが最初に作成されたとき、 self.aboutはもはや Noneであるという事実にある
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ではありません新しいものを作成せず、else条件にジャンプします。

最初のダイアログの後にダイアログを作成するにはどうしたらよいですか?

AboutDialogクラスのcloseEventメソッドをオーバーライドすることを考えましたが、ダイアログが閉じられたというメッセージを返すためにreadingListへの参照を取得する方法がわかりません。または、おそらく私はそれをoverthinking、おそらくself.about.show()からの戻り値は何とか使用することができますか?

+0

'AboutDialog'の' super(...).__ init __() 'は、' super(...).__ init __(parent) 'のように' parent'引数を渡します。これでダイアログを前面に表示することを心配する必要がなくなりました。 – xyres

答えて

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を使用している場合を除き、 )。

関連する問題