2016-09-29 6 views
0

qDialogBu​​ttonBoxに関するいくつかの質問があります。私のコードはまだ動作しますが、私はより良い洗練することができ、いくつかの部分があると考え、私はオンラインPyQt - QDialogBu​​ttonBoxのシグナルとツールチップ

class testDialog(QtGui.QDialog): 
    def __init_(self, parent=None): 
     ... 
     self.init_ui() 
     self.signals_connection() 

    def init_ui(self): 
     ... 
     self.buttonBox = QtGui.QDialogButtonBox() 
     self.buttonBox.addButton("Help", QtGui.QDialogButtonBox.HelpRole) 
     self.buttonBox.addButton("Apply", QtGui.QDialogButtonBox.AcceptRole) 
     self.buttonBox.addButton("Cancel", QtGui.QDialogButtonBox.RejectRole) 
     # 

    def signals_connection(self): 
     self.test_random.clicked.connect(self.test_rand) 

     # Is this the latest/correct way to write it? 
     self.buttonBox.accepted.connect(self.test_apply) 
     self.buttonBox.rejected.connect(self.test_cancel) 
     self.buttonBox.helpRequested.connect(self.test_help) 

    def test_apply(self): 
     print "I am clicking on Apply" 

    def test_cancel(self): 
     print "I am clicking on Cancel" 
     self.close() 

    def test_help(self): 
     print "I am clicking for Help!" 

多くの情報を見つけていないです、次のように/私の質問は次のとおりです。

  1. を私の機能の下に - signals_connection()、私は buttonBox(コードがまだ動作しますが)..私はself.test_randomのために書いてきた信号のための かなり異なっていると私はqdialogbuttonboxのための任意の同様のオンラインを見つけることができません 思いがあり のために書いたライン私が持っている別のスタイルですund - self.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), self, QtCore.SLOT("accept()"))しかし私は それは古いスタイルだと思う??それ以外の場合は、正しい方法でなければなりません それを書いてください?
  2. 私のtest_cancel()の機能では、self.close()最高の アプリケーションを閉じる方法を書いていますか?

    dialog = testDialog();dialog.show()

  3. を最後に、それは私が作成した3つのボタンに3種類のツールチップを追加することができ、: は次のように私は私のプログラムを実行する方法はありますか?私はそれにコマンドがあることを見た - self.buttonBox.setToolTip("Buttons for life!")しかし、これはすべての3つのボタンが同じツールチップを持つことになります。私はそれを個人として作ることはできますか?

答えて

1
  1. はい、それは信号接続を(あなたが見られる他の構文は実際にそれを行うための古い方法で)書き込むための正しい方法です。すべてのシグナルは、QDialogButtonBoxのpyqt文書にあります。異なるウィジェットとオブジェクトには異なる信号があります。 QPushButtonのものとQDialogButtonBoxのものは異なった信号を持っています。

  2. はい、close()はダイアログを閉じます。他のウィンドウが開いていない場合、QApplicationはデフォルトで終了します。ただし、これがモーダルダイアログの場合、通常はacceptまたはrejectコマンドのいずれかを使用してダイアログを閉じることが必要です。これはダイアログがOk/Yes/Applyボタンで閉じられたのか、 `No/Cancel 'ボタンで閉じられたのかを呼び出し関数に警告します。

  3. QDialogButtonBoxのボタンごとに異なるツールチップを設定できます。ツールヒントを設定する特定のボタンへの参照を取得するだけです。すべてのボタン

    for button in self.buttonBox.buttons(): 
        if button.text() == 'Help': 
         button.setToolTip('Help Tooltip') 
        elif button.text() == 'Apply': 
         button.setToolTip('Apply Tooltip') 
    

    self.buttonBox.button(QDialogButtonBox.Help).setToolTip('Help Tooltip') 
    self.buttonBox.button(QDialogButtonBox.Ok).setToolTip('Apply Tooltip') 
    

    それとも、例えば

可能性ループはまた、あなたがacceptrejectスロットにQDialogButtonBoxからacceptedrejected信号を接続することができon the QDialog

このように、ダイアログを閉じるために、OkCancelボタンをコールバックに手動で接続する必要はありません。説明的な情報をお寄せいただきありがとうございます。

+0

私はQDialogBu​​ttonBoxによって与えられた標準のボタンを使用していないので、私はボタンを手動で 'addButton'を使って作成しますが、あなたが挙げたツールチップを設定するための最初のメソッドを使うことができません。しかし、テキストを使ってループするとうまくいきますが、これはうまくいきます! 'self.close()'や 'self.buttonBox.rejected.connect(self.reject)'を使っても、アプリケーションは閉じたままですが、メモリ内のどこにでも存在するでしょうか? – dissidia

+0

@dissidiaはい、まだダイアログへの参照がある場合、ダイアログオブジェクトは引き続き存在し、引き続きサブコントロールとウィジェットにアクセスできます。参照を削除すると、最終的にガベージコレクションが行われ、存在しなくなります。 –

+0

アプリケーションをクリーンクローズするにはどうすればよいでしょうか? – dissidia

関連する問題