Добавление подробного текста в QMessageBox отключает кнопку закрытия (X) - PullRequest
4 голосов
/ 25 сентября 2011

Я заметил интересную вещь - если я добавлю подробный текст в QMessageBox (который добавляет кнопку «Показать подробности ...»), то при его выполнении будет отображена отключенная кнопка закрытия (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 ]

2 голосов
/ 24 сентября 2015

У меня была такая же проблема с 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 голос
/ 14 июля 2014

Я недавно сталкивался с этим на Qt 4.8 Linux.Я обнаружил, что отключение X зависит от ButtonRole, который я использовал при вызове QMessageBox :: addButton ().X был отключен, когда все роли были ActionRole - что на самом деле должно быть для кнопок, которые влияют на диалог, но не принимают и не отклоняют его.То, что сделали кнопки в моем случае, более точно описано как AcceptRole или RejectRole.Когда я изменил роли на один RejectRole, а остальные AcceptRole, X начал работать.Похоже, что QMessageBox неохотно принимал закрытие, когда ни у одной из кнопок не было ролей, которые были сопоставлены с закрытием.

1 голос
/ 30 июня 2012

Вам нужно сбросить флаг Qt :: WindowCloseButtonHint . Как это:

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

Вы также можете снять этот флаг Qt :: WindowSystemMenuHint.

Добавляет системное меню окна и, возможно, кнопку закрытия (например, на Mac). Если вам нужно скрыть или показать кнопку закрытия, она более переносима использовать WindowCloseButtonHint.

http://qt -project.org / док / кварта-4,8 / qt.html # WindowType-перечисление

...