2016-09-29 39 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. 是的,這是寫信號連接(你找到了其他的語法的確是這樣做的老辦法)的正確方法。你可以在pyqt文檔中找到QDialogButtonBox的所有信號。不同的小部件和對象具有不同的信號。 QPushButtonQDialogButtonBox有不同的信號。

  2. 是的,close()將關閉對話框。如果沒有其他窗口打開,默認情況下,QApplication將會退出。但是,如果這是模態對話框,則通常需要使用acceptreject命令關閉對話框。這將提醒調用函數關於對話框是用Ok/Yes/Apply按鈕關閉還是用'No/Cancel'按鈕關閉。

  3. 您可以爲QDialogButtonBox中的不同按鈕設置不同的工具提示。您只需要獲取要爲其設置工具提示的特定按鈕的引用。

例如

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

或者你可以通過所有的按鈕循環

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

此外,您可以在acceptedrejected信號從QDialogButtonBox連接到acceptreject插槽在QDialog

self.buttonBox.accepted.connect(self.accept) 
self.buttonBox.rejected.connect(self.reject) 

這樣,您不必手動將OkCancel按鈕連接到您的回調關閉對話框。

+0

感謝您的描述性信息。由於我沒有使用QDialogBu​​ttonBox給出的標準按鈕,而是使用'addButton'手動創建按鈕,所以似乎無法使用第一種方法來設置您提到的工具提示。然而,如果我通過文本循環它,它會起作用,這非常棒!通過使用'self.close()'或'self.buttonBox.rejected.connect(self.reject)',儘管你已經提到應用程序仍然會關閉,但是它會存在於內存中的任何位置嗎? – dissidia

+0

@dissidia是的,如果您仍然有對該對話框的引用,那麼對話框對象仍然存在,您仍然可以訪問它的子控件和小部件。如果你刪除了對它的引用,它最終會收集垃圾並停止存在。 –

+0

什麼是最好的方式來清理應用程序? – dissidia