如何从自定义QMessageBox捕获按钮单击?

时间:2014-08-29 14:17:21

标签: python pyqt pyside

如何修改下面自定义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()

2 个答案:

答案 0 :(得分:9)

而不是show您宁愿使用exec_方法,而是从QDialog继承的所有小部件都有:

http://doc.qt.io/qt-4.8/qmessagebox.html#exec

此方法将一直阻塞,直到msgbox关闭并返回结果:

result = msgBox.exec_()
if result == QtGui.QMessageBox.Yes:
    # do yes-action
else:
    # do no-action

答案 1 :(得分:1)

您想要msgBox.exec_(),即将其作为对话框运行。该调用的返回值等于按下的按钮,与QtGui.QMessageBox.YesQtGui.QMessageBox.No进行比较。

或者,如果您不想以模态方式运行,但要么有回调或定期轮询消息框,则以下内容将返回被单击的按钮(如果没有点击任何内容,则返回None;如果是消息框已关闭,没有按钮单击):

msgBox.clickedButton()

请注意,这会返回按钮实例,您必须自己弄清楚是哪个按钮。

buttonClicked()信号做了类似的事情。