2016-09-29 40 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