如何捕获自定义QMessageBox的按钮点击?
我该如何修改下面这个自定义的QMessageBox代码,以便知道用户是点击了'是'还是'否'?
from PySide import QtGui, QtCore
# Create a somewhat regular QMessageBox
msgBox = QtGui.QMessageBox( QtGui.QMessageBox.Question, "My title", "My text.", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No )
# Get the layout
question_layout = msgBox.layout()
# Additional widgets to add to the QMessageBox
qlabel_workspace_project = QtGui.QLabel('Some random data window:')
qtextedit_workspace_project = QtGui.QTextEdit()
qtextedit_workspace_project.setReadOnly(True)
# Add the new widgets
question_layout.addWidget(qlabel_workspace_project,question_layout.rowCount(), 0, 1, question_layout.columnCount() )
question_layout.addWidget(qtextedit_workspace_project,question_layout.rowCount(), 0, 1, question_layout.columnCount() )
# Show widget
msgBox.show()
3 个回答
0
对于非模态选项,mdurant/jesterjunk 的回答是正确的,不过为了完整起见,这里是你如何获取标准按钮值的:
result = msgBox.standardButton(msgBox.clickedButton())
if result == QtGui.QMessageBox.Yes:
# do yes-action
else:
# do no-action
1
你想要使用 msgBox.exec_()
,也就是说把它当作一个对话框来运行。这个调用会返回一个值,表示你按下了哪个按钮,你可以用 QtGui.QMessageBox.Yes
或 QtGui.QMessageBox.No
来比较。
另外,如果你不想让这个对话框阻塞其他操作,而是想要有一个回调函数或者定期检查这个消息框的状态,下面的代码会返回你点击的按钮(如果还没点击任何按钮,它会返回 None;如果对话框关闭但没有点击按钮,它会返回 0):
msgBox.clickedButton()
注意,这个返回的是按钮的实例,你需要自己判断这是哪个按钮。
而 buttonClicked()
信号也有类似的功能。
13
与其使用 show
,不如使用 exec_
方法,这个方法是所有从 QDialog
继承的窗口部件都有的:
http://doc.qt.io/qt-4.8/qmessagebox.html#exec
这个方法会一直等到消息框关闭后才继续执行,并且会返回结果:
result = msgBox.exec_()
if result == QtGui.QMessageBox.Yes:
# do yes-action
else:
# do no-action