【问题标题】:Adding detailed text in QMessageBox makes close (X) button disabled在 QMessageBox 中添加详细文本会禁用关闭 (X) 按钮
【发布时间】:2011-11-24 11:43:44
【问题描述】:

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

这里是一些示例代码:

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

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

谢谢

【问题讨论】:

  • 现在这很奇怪,我刚刚在 OS X 和 Linux 上验证了它。我已经挖掘了 QMessageBox setDetailedText 的源代码,它并没有专门做任何明显的事情来阻止闭包。我唯一可以建议的事情是观察单击和覆盖时发送的关闭信号,或者子类化 QMessageBox。
  • 你使用的是什么 Qt 版本?
  • 我的是 4.5.2。稍后我也会尝试 4.7.X。
  • 但是如果需要,您知道如何在某些对话框/窗口上完成此操作吗?我只知道一种通过 WindowFlags 删除关闭按钮但不让它存在但禁用的方法。这更多的是好奇而不是迫切的需要。
  • 另一个有趣的例子是,如果您将YesNoYesToAllNoToAll 按钮放在QMessageBox 中。我认为这与当时的亲密模棱两可有关。如果我将No 更改为Cancel,“red-x”会重新显示。

标签: qt qmessagebox


【解决方案1】:

我在使用 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_()

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      你也可以取消设置这个标志 Qt::WindowSystemMenuHint。

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

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

      【讨论】:

      • 这个解决方案在 PySide 下对我不起作用。请参阅我的解决方法。
      猜你喜欢
      • 2014-04-26
      • 2013-06-27
      • 1970-01-01
      • 2015-05-13
      • 2019-04-15
      • 2013-09-26
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      相关资源
      最近更新 更多