6

興味深いことに気づきました。QMessageBoxに詳細なテキストを追加すると([詳細を表示...]ボタンが追加されます)、それを実行すると、システムフレームの閉じる(X)ボタンが無効になり、このウィンドウが閉じられないものとしてマークされます(フレームを右クリック->閉じる無効)。

サンプルコードは次のとおりです。

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

Qtでこれを手動で行う方法すら見つかりませんでした。何か案は?

ありがとう

4

3 に答える 3

6

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_()

これにより、目的の閉じるボタンの動作が復元されます。

于 2015-09-24T14:38:30.083 に答える
3

最近 Qt 4.8 Linux でこれに遭遇しました。X が無効になっているかどうかは、QMessageBox::addButton() の呼び出しで使用した ButtonRole に依存することがわかりました。すべてのロールが ActionRole の場合、X は無効になりました。これは、実際にはダイアログに影響を与えるボタン用であると想定されていますが、それを受け入れたり拒否したりしません。私の場合、ボタンが何をしたかは、AcceptRole または RejectRole としてより正確に説明されます。1 つの RejectRole と残りの AcceptRole を持つようにロールを変更すると、X が機能し始めました。どのボタンにも閉じるようにマップされた役割がない場合、QMessageBox は閉じるのを受け入れることに消極的だったようです。

于 2014-07-14T18:53:02.493 に答える
2

Qt::WindowCloseButtonHintウィジェット フラグの設定を解除する必要があります。このような:

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

このフラグ Qt::WindowSystemMenuHint の設定を解除することもできます。

ウィンドウ システム メニューと、場合によっては閉じるボタン (Mac など) を追加します。閉じるボタンを非表示または表示する必要がある場合は、WindowCloseButtonHint を使用する方が移植性が高くなります。

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

于 2012-06-29T21:44:52.933 に答える