在QMessageBox中添加详细文本会禁用关闭(X)按钮

时间:2011-09-25 02:26:24

标签: qt qmessagebox

我注意到一件有趣的事情 - 如果我向QMessageBox添加一个详细的文本(添加“Show Details ...”按钮),那么执行它将显示系统框架的关闭(X)按钮被禁用,因此将此窗口标记为非-closable(右键单击框架 - >关闭禁用)。

以下是一些示例代码:

QMessageBox box(QMessageBox::Critical, title, text, QMessageBox::Ok);
box.setDetailedText(detailedText); // comment this line to get close button enabled
box.exec();

我甚至没有找到在Qt中手动执行此操作的方法。有什么想法吗?

由于

3 个答案:

答案 0 :(得分:2)

我遇到了与Python 2.7和PySide相同的问题。

在此示例中,红色关闭按钮按预期工作:

from PySide import QtGui, QtCore
import sys

app = QtGui.QApplication(sys.argv)

message_box = QtGui.QMessageBox()
message_box.setWindowTitle("Close Test")
message_box.setText("Testing whether or not the red X is enabled.")

ret = message_box.exec_()

添加详细文字会禁用关闭按钮:

from PySide import QtGui, QtCore
import sys

app = QtGui.QApplication(sys.argv)

message_box = QtGui.QMessageBox()
message_box.setWindowTitle("Close Test")
message_box.setText("Testing whether or not the red X is enabled.")
message_box.setDetailedText("These details disable the close button for some reason.")

ret = message_box.exec_()

标记为解决方案的答案无法解决此问题。正如您在此示例中所看到的,关闭按钮仍处于禁用状态:

from PySide import QtGui, QtCore
import sys

app = QtGui.QApplication(sys.argv)

message_box = QtGui.QMessageBox()
message_box.setWindowTitle("Close Test")
message_box.setText("Testing whether or not the red X is enabled.")
message_box.setDetailedText("These details disable the close button for some reason.")

message_box.setWindowFlags(message_box.windowFlags() & ~QtCore.Qt.WindowCloseButtonHint)

ret = message_box.exec_()

答案是设置标准按钮并设置转义按钮:

from PySide import QtGui, QtCore
import sys

app = QtGui.QApplication(sys.argv)

message_box = QtGui.QMessageBox()
message_box.setWindowTitle("Close Test")
message_box.setText("Testing whether or not the red X is enabled.")
message_box.setDetailedText("These details disable the close button for some reason.")

message_box.setStandardButtons(QtGui.QMessageBox.Ok)
message_box.setDefaultButton(QtGui.QMessageBox.Ok)
message_box.setEscapeButton(QtGui.QMessageBox.Ok)

ret = message_box.exec_()

这将恢复所需的关闭按钮行为。

答案 1 :(得分:1)

您需要取消设置 Qt :: WindowCloseButtonHint 小部件标志。像这样:

QMessageBox messageBox;
messageBox.setWindowFlags(messageBox.windowFlags() & ~Qt::WindowCloseButtonHint);

您也可以取消设置此标志Qt :: WindowSystemMenuHint。

  

添加一个窗口系统菜单,可能还有一个关闭按钮(例如on   苹果电脑)。如果您需要隐藏或显示关闭按钮,它更便于携带   使用WindowCloseButtonHint。

http://qt-project.org/doc/qt-4.8/qt.html#WindowType-enum

答案 2 :(得分:1)

我最近在Qt 4.8 Linux上遇到过这个问题。我发现X是否被禁用取决于我在调用QMessageBox :: addButton()时使用的ButtonRole。当所有角色都是ActionRole时,X被禁用 - 这实际上应该是影响对话框的按钮,但不接受或拒绝它。我的情况下按钮的作用更准确地描述为AcceptRole或RejectRole。当我将角色更改为具有一个RejectRole和其余的AcceptRole时,X开始工作。当没有任何按钮具有映射为关闭的角色时,QMessageBox似乎不愿意接受关闭。