2015-12-10 05:06:13 +02:00
|
|
|
/****************************************************************************
|
|
|
|
**
|
|
|
|
** Copyright (C) 2015 The Qt Company Ltd.
|
|
|
|
** Contact: http://www.qt.io/licensing/
|
|
|
|
**
|
|
|
|
** This file is part of the QtGui module of the Qt Toolkit.
|
|
|
|
**
|
|
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
|
|
|
** Commercial License Usage
|
|
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
|
|
** accordance with the commercial license agreement provided with the
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
|
|
** a written agreement between you and The Qt Company. For licensing terms
|
|
|
|
** and conditions see http://www.qt.io/terms-conditions. For further
|
|
|
|
** information use the contact form at http://www.qt.io/contact-us.
|
|
|
|
**
|
|
|
|
** GNU Lesser General Public License Usage
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
|
|
** General Public License version 2.1 or version 3 as published by the Free
|
|
|
|
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
|
|
|
|
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
|
|
|
|
** following information to ensure the GNU Lesser General Public License
|
|
|
|
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
|
|
|
|
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
|
|
**
|
|
|
|
** As a special exception, The Qt Company gives you certain additional
|
|
|
|
** rights. These rights are described in The Qt Company LGPL Exception
|
|
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
|
|
**
|
|
|
|
** GNU General Public License Usage
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
|
|
** General Public License version 3.0 as published by the Free Software
|
|
|
|
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
|
|
** packaging of this file. Please review the following information to
|
|
|
|
** ensure the GNU General Public License version 3.0 requirements will be
|
|
|
|
** met: http://www.gnu.org/copyleft/gpl.html.
|
|
|
|
**
|
|
|
|
** $QT_END_LICENSE$
|
|
|
|
**
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#include <QtGui/qmessagebox.h>
|
|
|
|
|
|
|
|
#ifndef QT_NO_MESSAGEBOX
|
|
|
|
|
|
|
|
#include <QtGui/qdialogbuttonbox.h>
|
|
|
|
#include "qlabel_p.h"
|
|
|
|
#include "qapplication_p.h"
|
|
|
|
#include <QtCore/qlist.h>
|
|
|
|
#include <QtCore/qdebug.h>
|
|
|
|
#include <QtGui/qstyle.h>
|
|
|
|
#include <QtGui/qstyleoption.h>
|
|
|
|
#include <QtGui/qgridlayout.h>
|
|
|
|
#include <QtGui/qdesktopwidget.h>
|
|
|
|
#include <QtGui/qpushbutton.h>
|
|
|
|
#ifndef QT_NO_ACCESSIBILITY
|
|
|
|
# include <QtGui/qaccessible.h>
|
|
|
|
#endif
|
|
|
|
#include <QtGui/qicon.h>
|
|
|
|
#include <QtGui/qtextdocument.h>
|
|
|
|
#include <QtGui/qapplication.h>
|
|
|
|
#include <QtGui/qtextedit.h>
|
|
|
|
#include <QtGui/qtextbrowser.h>
|
|
|
|
#include <QtGui/qmenu.h>
|
|
|
|
#include "qdialog_p.h"
|
|
|
|
#include <QtGui/qfont.h>
|
|
|
|
#include <QtGui/qfontmetrics.h>
|
|
|
|
#include <QtGui/qclipboard.h>
|
|
|
|
|
|
|
|
QT_BEGIN_NAMESPACE
|
|
|
|
|
|
|
|
enum DetailButtonLabel { ShowLabel = 0, HideLabel = 1 };
|
|
|
|
#ifndef QT_NO_TEXTEDIT
|
|
|
|
class QMessageBoxDetailsText : public QWidget
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
class TextEdit : public QTextEdit
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
TextEdit(QWidget *parent=0) : QTextEdit(parent) { }
|
|
|
|
void contextMenuEvent(QContextMenuEvent * e)
|
|
|
|
{
|
|
|
|
#ifndef QT_NO_CONTEXTMENU
|
|
|
|
QMenu *menu = createStandardContextMenu();
|
|
|
|
menu->setAttribute(Qt::WA_DeleteOnClose);
|
|
|
|
menu->popup(e->globalPos());
|
|
|
|
#else
|
|
|
|
Q_UNUSED(e);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
QMessageBoxDetailsText(QWidget *parent=0)
|
|
|
|
: QWidget(parent)
|
|
|
|
{
|
|
|
|
QVBoxLayout *layout = new QVBoxLayout;
|
|
|
|
layout->setMargin(0);
|
|
|
|
QFrame *line = new QFrame(this);
|
|
|
|
line->setFrameShape(QFrame::HLine);
|
|
|
|
line->setFrameShadow(QFrame::Sunken);
|
|
|
|
layout->addWidget(line);
|
|
|
|
textEdit = new TextEdit();
|
|
|
|
textEdit->setFixedHeight(100);
|
|
|
|
textEdit->setFocusPolicy(Qt::NoFocus);
|
|
|
|
textEdit->setReadOnly(true);
|
|
|
|
layout->addWidget(textEdit);
|
|
|
|
setLayout(layout);
|
|
|
|
}
|
|
|
|
void setText(const QString &text) { textEdit->setPlainText(text); }
|
|
|
|
QString text() const { return textEdit->toPlainText(); }
|
|
|
|
private:
|
|
|
|
TextEdit *textEdit;
|
|
|
|
};
|
|
|
|
#endif // QT_NO_TEXTEDIT
|
|
|
|
|
|
|
|
class DetailButton : public QPushButton
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
DetailButton(QWidget *parent) : QPushButton(label(ShowLabel), parent)
|
|
|
|
{
|
|
|
|
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
|
|
|
}
|
|
|
|
|
|
|
|
QString label(DetailButtonLabel label) const
|
|
|
|
{ return label == ShowLabel ? QMessageBox::tr("Show Details...") : QMessageBox::tr("Hide Details..."); }
|
|
|
|
|
|
|
|
void setLabel(DetailButtonLabel lbl)
|
|
|
|
{ setText(label(lbl)); }
|
|
|
|
|
|
|
|
QSize sizeHint() const
|
|
|
|
{
|
|
|
|
ensurePolished();
|
|
|
|
QStyleOptionButton opt;
|
|
|
|
initStyleOption(&opt);
|
|
|
|
const QFontMetrics fm = fontMetrics();
|
|
|
|
opt.text = label(ShowLabel);
|
|
|
|
QSize sz = fm.size(Qt::TextShowMnemonic, opt.text);
|
|
|
|
QSize ret = style()->sizeFromContents(QStyle::CT_PushButton, &opt, sz, this).
|
|
|
|
expandedTo(QApplication::globalStrut());
|
|
|
|
opt.text = label(HideLabel);
|
|
|
|
sz = fm.size(Qt::TextShowMnemonic, opt.text);
|
|
|
|
ret = ret.expandedTo(style()->sizeFromContents(QStyle::CT_PushButton, &opt, sz, this).
|
|
|
|
expandedTo(QApplication::globalStrut()));
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class QMessageBoxPrivate : public QDialogPrivate
|
|
|
|
{
|
|
|
|
Q_DECLARE_PUBLIC(QMessageBox)
|
|
|
|
|
|
|
|
public:
|
|
|
|
QMessageBoxPrivate() : escapeButton(0), defaultButton(0), clickedButton(0), detailsButton(0),
|
|
|
|
#ifndef QT_NO_TEXTEDIT
|
|
|
|
detailsText(0),
|
|
|
|
#endif
|
2016-02-02 23:00:43 +02:00
|
|
|
autoAddOkButton(true),
|
2015-12-10 05:06:13 +02:00
|
|
|
detectedEscapeButton(0), informativeLabel(0) { }
|
|
|
|
|
|
|
|
void init(const QString &title = QString(), const QString &text = QString());
|
|
|
|
void _q_buttonClicked(QAbstractButton *);
|
|
|
|
|
|
|
|
int execReturnCode(QAbstractButton *button);
|
|
|
|
|
|
|
|
void detectEscapeButton();
|
|
|
|
void updateSize();
|
|
|
|
int layoutMinimumWidth();
|
|
|
|
void retranslateStrings();
|
|
|
|
|
|
|
|
static QMessageBox::StandardButton showNewMessageBox(QWidget *parent,
|
|
|
|
QMessageBox::Icon icon, const QString& title, const QString& text,
|
|
|
|
QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton);
|
|
|
|
|
|
|
|
static QPixmap standardIcon(QMessageBox::Icon icon, QMessageBox *mb);
|
|
|
|
|
|
|
|
QLabel *label;
|
|
|
|
QMessageBox::Icon icon;
|
|
|
|
QLabel *iconLabel;
|
|
|
|
QDialogButtonBox *buttonBox;
|
|
|
|
QList<QAbstractButton *> customButtonList;
|
|
|
|
QAbstractButton *escapeButton;
|
|
|
|
QPushButton *defaultButton;
|
|
|
|
QAbstractButton *clickedButton;
|
|
|
|
DetailButton *detailsButton;
|
|
|
|
#ifndef QT_NO_TEXTEDIT
|
|
|
|
QMessageBoxDetailsText *detailsText;
|
|
|
|
#endif
|
|
|
|
bool autoAddOkButton;
|
|
|
|
QAbstractButton *detectedEscapeButton;
|
|
|
|
QLabel *informativeLabel;
|
|
|
|
#if defined(Q_WS_MAEMO_5)
|
|
|
|
QTextBrowser *textBrowser;
|
|
|
|
#endif
|
|
|
|
QPointer<QObject> receiverToDisconnectOnClose;
|
|
|
|
QByteArray memberToDisconnectOnClose;
|
|
|
|
QByteArray signalToDisconnectOnClose;
|
|
|
|
};
|
|
|
|
|
|
|
|
void QMessageBoxPrivate::init(const QString &title, const QString &text)
|
|
|
|
{
|
|
|
|
Q_Q(QMessageBox);
|
|
|
|
|
|
|
|
label = new QLabel;
|
|
|
|
label->setObjectName(QLatin1String("qt_msgbox_label"));
|
|
|
|
label->setTextInteractionFlags(Qt::TextInteractionFlags(q->style()->styleHint(QStyle::SH_MessageBox_TextInteractionFlags, 0, q)));
|
|
|
|
label->setAlignment(Qt::AlignVCenter | Qt::AlignLeft);
|
|
|
|
label->setOpenExternalLinks(true);
|
|
|
|
label->setContentsMargins(2, 0, 0, 0);
|
|
|
|
label->setIndent(9);
|
|
|
|
icon = QMessageBox::NoIcon;
|
|
|
|
iconLabel = new QLabel;
|
|
|
|
iconLabel->setObjectName(QLatin1String("qt_msgboxex_icon_label"));
|
|
|
|
iconLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
|
|
|
|
|
|
|
buttonBox = new QDialogButtonBox;
|
|
|
|
buttonBox->setObjectName(QLatin1String("qt_msgbox_buttonbox"));
|
|
|
|
buttonBox->setCenterButtons(q->style()->styleHint(QStyle::SH_MessageBox_CenterButtons, 0, q));
|
|
|
|
QObject::connect(buttonBox, SIGNAL(clicked(QAbstractButton*)),
|
|
|
|
q, SLOT(_q_buttonClicked(QAbstractButton*)));
|
|
|
|
|
|
|
|
QGridLayout *grid = new QGridLayout;
|
|
|
|
const int preferredIconColumn = 0;
|
|
|
|
const int preferredTextColumn = 1;
|
|
|
|
grid->addWidget(iconLabel, 0, preferredIconColumn, 2, 1, Qt::AlignTop);
|
|
|
|
grid->addWidget(label, 0, preferredTextColumn, 1, 1);
|
|
|
|
// -- leave space for information label --
|
|
|
|
grid->addWidget(buttonBox, 2, 0, 1, 2);
|
|
|
|
|
|
|
|
grid->setSizeConstraint(QLayout::SetNoConstraint);
|
|
|
|
q->setLayout(grid);
|
|
|
|
|
|
|
|
if (!title.isEmpty() || !text.isEmpty()) {
|
|
|
|
q->setWindowTitle(title);
|
|
|
|
q->setText(text);
|
|
|
|
}
|
|
|
|
q->setModal(true);
|
|
|
|
|
|
|
|
retranslateStrings();
|
|
|
|
}
|
|
|
|
|
|
|
|
int QMessageBoxPrivate::layoutMinimumWidth()
|
|
|
|
{
|
|
|
|
layout->activate();
|
|
|
|
return layout->totalMinimumSize().width();
|
|
|
|
}
|
|
|
|
|
|
|
|
void QMessageBoxPrivate::updateSize()
|
|
|
|
{
|
|
|
|
Q_Q(QMessageBox);
|
|
|
|
|
|
|
|
if (!q->isVisible())
|
|
|
|
return;
|
|
|
|
|
2016-09-18 23:41:08 +00:00
|
|
|
const QSize screenSize = QApplication::desktop()->availableGeometry(QCursor::pos()).size();
|
2015-12-10 05:06:13 +02:00
|
|
|
int hardLimit = qMin(screenSize.width() - 480, 1000); // can never get bigger than this
|
|
|
|
// on small screens allows the messagebox be the same size as the screen
|
|
|
|
if (screenSize.width() <= 1024)
|
|
|
|
hardLimit = screenSize.width();
|
2016-09-18 23:41:08 +00:00
|
|
|
const int softLimit = qMin(screenSize.width()/2, 500);
|
2015-12-10 05:06:13 +02:00
|
|
|
|
|
|
|
if (informativeLabel)
|
|
|
|
informativeLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
|
|
|
|
|
|
|
|
label->setWordWrap(false); // makes the label return min size
|
|
|
|
int width = layoutMinimumWidth();
|
|
|
|
|
|
|
|
if (width > softLimit) {
|
|
|
|
label->setWordWrap(true);
|
|
|
|
width = qMax(softLimit, layoutMinimumWidth());
|
|
|
|
|
|
|
|
if (width > hardLimit) {
|
|
|
|
label->d_func()->ensureTextControl();
|
|
|
|
if (QTextControl *control = label->d_func()->control) {
|
|
|
|
QTextOption opt = control->document()->defaultTextOption();
|
|
|
|
opt.setWrapMode(QTextOption::WrapAnywhere);
|
|
|
|
control->document()->setDefaultTextOption(opt);
|
|
|
|
}
|
|
|
|
width = hardLimit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (informativeLabel) {
|
|
|
|
label->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
|
|
|
|
QSizePolicy policy(QSizePolicy::Minimum, QSizePolicy::Preferred);
|
|
|
|
policy.setHeightForWidth(true);
|
|
|
|
informativeLabel->setSizePolicy(policy);
|
|
|
|
width = qMax(width, layoutMinimumWidth());
|
|
|
|
if (width > hardLimit) { // longest word is really big, so wrap anywhere
|
|
|
|
informativeLabel->d_func()->ensureTextControl();
|
|
|
|
if (QTextControl *control = informativeLabel->d_func()->control) {
|
|
|
|
QTextOption opt = control->document()->defaultTextOption();
|
|
|
|
opt.setWrapMode(QTextOption::WrapAnywhere);
|
|
|
|
control->document()->setDefaultTextOption(opt);
|
|
|
|
}
|
|
|
|
width = hardLimit;
|
|
|
|
}
|
|
|
|
policy.setHeightForWidth(label->wordWrap());
|
|
|
|
label->setSizePolicy(policy);
|
|
|
|
}
|
|
|
|
|
|
|
|
QFontMetrics fm(QApplication::font("QWorkspaceTitleBar"));
|
|
|
|
int windowTitleWidth = qMin(fm.width(q->windowTitle()) + 50, hardLimit);
|
|
|
|
if (windowTitleWidth > width)
|
|
|
|
width = windowTitleWidth;
|
|
|
|
|
|
|
|
layout->activate();
|
|
|
|
int height = (layout->hasHeightForWidth())
|
|
|
|
? layout->totalHeightForWidth(width)
|
|
|
|
: layout->totalMinimumSize().height();
|
|
|
|
|
|
|
|
q->setFixedSize(width, height);
|
|
|
|
QCoreApplication::removePostedEvents(q, QEvent::LayoutRequest);
|
|
|
|
}
|
|
|
|
|
|
|
|
int QMessageBoxPrivate::execReturnCode(QAbstractButton *button)
|
|
|
|
{
|
|
|
|
int ret = buttonBox->standardButton(button);
|
|
|
|
if (ret == QMessageBox::NoButton) {
|
|
|
|
ret = customButtonList.indexOf(button); // if button == 0, correctly sets ret = -1
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
void QMessageBoxPrivate::_q_buttonClicked(QAbstractButton *button)
|
|
|
|
{
|
|
|
|
Q_Q(QMessageBox);
|
|
|
|
#ifndef QT_NO_TEXTEDIT
|
|
|
|
if (detailsButton && detailsText && button == detailsButton) {
|
|
|
|
detailsButton->setLabel(detailsText->isHidden() ? HideLabel : ShowLabel);
|
|
|
|
detailsText->setHidden(!detailsText->isHidden());
|
|
|
|
updateSize();
|
|
|
|
} else
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
clickedButton = button;
|
|
|
|
q->done(execReturnCode(button)); // does not trigger closeEvent
|
|
|
|
emit q->buttonClicked(button);
|
|
|
|
|
|
|
|
if (receiverToDisconnectOnClose) {
|
|
|
|
QObject::disconnect(q, signalToDisconnectOnClose, receiverToDisconnectOnClose,
|
|
|
|
memberToDisconnectOnClose);
|
|
|
|
receiverToDisconnectOnClose = 0;
|
|
|
|
}
|
|
|
|
signalToDisconnectOnClose.clear();
|
|
|
|
memberToDisconnectOnClose.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\class QMessageBox
|
|
|
|
|
|
|
|
\brief The QMessageBox class provides a modal dialog for informing
|
|
|
|
the user or for asking the user a question and receiving an answer.
|
|
|
|
|
|
|
|
\ingroup standard-dialogs
|
|
|
|
|
|
|
|
|
|
|
|
A message box displays a primary \l{QMessageBox::text}{text} to
|
|
|
|
alert the user to a situation, an \l{QMessageBox::informativeText}
|
|
|
|
{informative text} to further explain the alert or to ask the user
|
|
|
|
a question, and an optional \l{QMessageBox::detailedText}
|
|
|
|
{detailed text} to provide even more data if the user requests
|
|
|
|
it. A message box can also display an \l{QMessageBox::icon} {icon}
|
|
|
|
and \l{QMessageBox::standardButtons} {standard buttons} for
|
|
|
|
accepting a user response.
|
|
|
|
|
|
|
|
Two APIs for using QMessageBox are provided, the property-based
|
|
|
|
API, and the static functions. Calling one of the static functions
|
|
|
|
is the simpler approach, but it is less flexible than using the
|
|
|
|
property-based API, and the result is less informative. Using the
|
|
|
|
property-based API is recommended.
|
|
|
|
|
|
|
|
\section1 The Property-based API
|
|
|
|
|
|
|
|
To use the property-based API, construct an instance of
|
|
|
|
QMessageBox, set the desired properties, and call exec() to show
|
|
|
|
the message. The simplest configuration is to set only the
|
|
|
|
\l{QMessageBox::text} {message text} property.
|
|
|
|
|
|
|
|
\snippet doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp 5
|
|
|
|
|
|
|
|
The user must click the \gui{OK} button to dismiss the message
|
|
|
|
box. The rest of the GUI is blocked until the message box is
|
|
|
|
dismissed.
|
|
|
|
|
|
|
|
\image msgbox1.png
|
|
|
|
|
|
|
|
A better approach than just alerting the user to an event is to
|
|
|
|
also ask the user what to do about it. Store the question in the
|
|
|
|
\l{QMessageBox::informativeText} {informative text} property, and
|
|
|
|
set the \l{QMessageBox::standardButtons} {standard buttons}
|
|
|
|
property to the set of buttons you want as the set of user
|
|
|
|
responses. The buttons are specified by combining values from
|
|
|
|
StandardButtons using the bitwise OR operator. The display order
|
|
|
|
for the buttons is platform-dependent. For example, on Windows,
|
|
|
|
\gui{Save} is displayed to the left of \gui{Cancel}, whereas on
|
|
|
|
Mac OS, the order is reversed.
|
|
|
|
|
|
|
|
Mark one of your standard buttons to be your
|
|
|
|
\l{QMessageBox::defaultButton()} {default button}.
|
|
|
|
|
|
|
|
\snippet doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp 6
|
|
|
|
|
|
|
|
This is the approach recommended in the
|
|
|
|
\l{http://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/AppleHIGuidelines/Windows/Windows.html#//apple_ref/doc/uid/20000961-BABCAJID}
|
|
|
|
{Mac OS X Guidelines}. Similar guidelines apply for the other
|
|
|
|
platforms, but note the different ways the
|
|
|
|
\l{QMessageBox::informativeText} {informative text} is handled for
|
|
|
|
different platforms.
|
|
|
|
|
|
|
|
\image msgbox2.png
|
|
|
|
|
|
|
|
The exec() slot returns the StandardButtons value of the button
|
|
|
|
that was clicked.
|
|
|
|
|
|
|
|
\snippet doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp 7
|
|
|
|
|
|
|
|
To give the user more information to help him answer the question,
|
|
|
|
set the \l{QMessageBox::detailedText} {detailed text} property. If
|
|
|
|
the \l{QMessageBox::detailedText} {detailed text} property is set,
|
|
|
|
the \gui{Show Details...} button will be shown.
|
|
|
|
|
|
|
|
\image msgbox3.png
|
|
|
|
|
|
|
|
Clicking the \gui{Show Details...} button displays the detailed text.
|
|
|
|
|
|
|
|
\image msgbox4.png
|
|
|
|
|
|
|
|
\section2 Rich Text and the Text Format Property
|
|
|
|
|
|
|
|
The \l{QMessageBox::detailedText} {detailed text} property is
|
|
|
|
always interpreted as plain text. The \l{QMessageBox::text} {main
|
|
|
|
text} and \l{QMessageBox::informativeText} {informative text}
|
|
|
|
properties can be either plain text or rich text. These strings
|
|
|
|
are interpreted according to the setting of the
|
|
|
|
\l{QMessageBox::textFormat} {text format} property. The default
|
|
|
|
setting is \l{Qt::AutoText} {auto-text}.
|
|
|
|
|
|
|
|
Note that for some plain text strings containing XML
|
|
|
|
meta-characters, the auto-text \l{Qt::mightBeRichText()} {rich
|
|
|
|
text detection test} may fail causing your plain text string to be
|
|
|
|
interpreted incorrectly as rich text. In these rare cases, use
|
|
|
|
Qt::convertFromPlainText() to convert your plain text string to a
|
|
|
|
visually equivalent rich text string, or set the
|
|
|
|
\l{QMessageBox::textFormat} {text format} property explicitly with
|
|
|
|
setTextFormat().
|
|
|
|
|
|
|
|
\section2 Severity Levels and the Icon and Pixmap Properties
|
|
|
|
|
|
|
|
QMessageBox supports four predefined message severity levels, or message
|
|
|
|
types, which really only differ in the predefined icon they each show.
|
|
|
|
Specify one of the four predefined message types by setting the
|
|
|
|
\l{QMessageBox::icon}{icon} property to one of the
|
|
|
|
\l{QMessageBox::Icon}{predefined icons}. The following rules are
|
|
|
|
guidelines:
|
|
|
|
|
|
|
|
\table
|
|
|
|
\row
|
|
|
|
\o \img qmessagebox-quest.png
|
|
|
|
\o \l Question
|
|
|
|
\o For asking a question during normal operations.
|
|
|
|
\row
|
|
|
|
\o \img qmessagebox-info.png
|
|
|
|
\o \l Information
|
|
|
|
\o For reporting information about normal operations.
|
|
|
|
\row
|
|
|
|
\o \img qmessagebox-warn.png
|
|
|
|
\o \l Warning
|
|
|
|
\o For reporting non-critical errors.
|
|
|
|
\row
|
|
|
|
\o \img qmessagebox-crit.png
|
|
|
|
\o \l Critical
|
|
|
|
\o For reporting critical errors.
|
|
|
|
\endtable
|
|
|
|
|
|
|
|
\l{QMessageBox::Icon}{Predefined icons} are not defined by QMessageBox, but
|
|
|
|
provided by the style. The default value is \l{QMessageBox::NoIcon}
|
|
|
|
{No Icon}. The message boxes are otherwise the same for all cases. When
|
|
|
|
using a standard icon, use the one recommended in the table, or use the
|
|
|
|
one recommended by the style guidelines for your platform. If none of the
|
|
|
|
standard icons is right for your message box, you can use a custom icon by
|
|
|
|
setting the \l{QMessageBox::iconPixmap}{icon pixmap} property instead of
|
|
|
|
setting the \l{QMessageBox::icon}{icon} property.
|
|
|
|
|
|
|
|
In summary, to set an icon, use \e{either} setIcon() for one of the
|
|
|
|
standard icons, \e{or} setIconPixmap() for a custom icon.
|
|
|
|
|
|
|
|
\section1 The Static Functions API
|
|
|
|
|
|
|
|
Building message boxes with the static functions API, although
|
|
|
|
convenient, is less flexible than using the property-based API,
|
|
|
|
because the static function signatures lack parameters for setting
|
|
|
|
the \l{QMessageBox::informativeText} {informative text} and
|
|
|
|
\l{QMessageBox::detailedText} {detailed text} properties. One
|
|
|
|
work-around for this has been to use the \c{title} parameter as
|
|
|
|
the message box main text and the \c{text} parameter as the
|
|
|
|
message box informative text. Because this has the obvious
|
|
|
|
drawback of making a less readable message box, platform
|
|
|
|
guidelines do not recommend it. The \e{Microsoft Windows User
|
|
|
|
Interface Guidelines} recommend using the
|
|
|
|
\l{QCoreApplication::applicationName} {application name} as the
|
|
|
|
\l{QMessageBox::setWindowTitle()} {window's title}, which means
|
|
|
|
that if you have an informative text in addition to your main
|
|
|
|
text, you must concatenate it to the \c{text} parameter.
|
|
|
|
|
|
|
|
Note that the static function signatures have changed with respect
|
|
|
|
to their button parameters, which are now used to set the
|
|
|
|
\l{QMessageBox::standardButtons} {standard buttons} and the
|
|
|
|
\l{QMessageBox::defaultButton()} {default button}.
|
|
|
|
|
|
|
|
Static functions are available for creating information(),
|
|
|
|
question(), warning(), and critical() message boxes.
|
|
|
|
|
|
|
|
\snippet doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp 0
|
|
|
|
|
|
|
|
The \l{dialogs/standarddialogs}{Standard Dialogs} example shows
|
|
|
|
how to use QMessageBox and the other built-in Qt dialogs.
|
|
|
|
|
|
|
|
\section1 Advanced Usage
|
|
|
|
|
|
|
|
If the \l{QMessageBox::StandardButtons} {standard buttons} are not
|
|
|
|
flexible enough for your message box, you can use the addButton()
|
|
|
|
overload that takes a text and a ButtonRoleto to add custom
|
|
|
|
buttons. The ButtonRole is used by QMessageBox to determine the
|
|
|
|
ordering of the buttons on screen (which varies according to the
|
|
|
|
platform). You can test the value of clickedButton() after calling
|
|
|
|
exec(). For example,
|
|
|
|
|
|
|
|
\snippet doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp 2
|
|
|
|
|
|
|
|
\section1 Default and Escape Keys
|
|
|
|
|
|
|
|
The default button (i.e., the button activated when \key Enter is
|
|
|
|
pressed) can be specified using setDefaultButton(). If a default
|
|
|
|
button is not specified, QMessageBox tries to find one based on
|
|
|
|
the \l{ButtonRole} {button roles} of the buttons used in the
|
|
|
|
message box.
|
|
|
|
|
|
|
|
The escape button (the button activated when \key Esc is pressed)
|
|
|
|
can be specified using setEscapeButton(). If an escape button is
|
|
|
|
not specified, QMessageBox tries to find one using these rules:
|
|
|
|
|
|
|
|
\list 1
|
|
|
|
|
|
|
|
\o If there is only one button, it is the button activated when
|
|
|
|
\key Esc is pressed.
|
|
|
|
|
|
|
|
\o If there is a \l Cancel button, it is the button activated when
|
|
|
|
\key Esc is pressed.
|
|
|
|
|
|
|
|
\o If there is exactly one button having either
|
|
|
|
\l{QMessageBox::RejectRole} {the Reject role} or the
|
|
|
|
\l{QMessageBox::NoRole} {the No role}, it is the button
|
|
|
|
activated when \key Esc is pressed.
|
|
|
|
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
When an escape button can't be determined using these rules,
|
|
|
|
pressing \key Esc has no effect.
|
|
|
|
|
|
|
|
\sa QDialogButtonBox, {fowler}{GUI Design Handbook: Message Box}, {Standard Dialogs Example}, {Application Example}
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\enum QMessageBox::StandardButton
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
These enums describe flags for standard buttons. Each button has a
|
|
|
|
defined \l ButtonRole.
|
|
|
|
|
|
|
|
\value Ok An "OK" button defined with the \l AcceptRole.
|
|
|
|
\value Open A "Open" button defined with the \l AcceptRole.
|
|
|
|
\value Save A "Save" button defined with the \l AcceptRole.
|
|
|
|
\value Cancel A "Cancel" button defined with the \l RejectRole.
|
|
|
|
\value Close A "Close" button defined with the \l RejectRole.
|
|
|
|
\value Discard A "Discard" or "Don't Save" button, depending on the platform,
|
|
|
|
defined with the \l DestructiveRole.
|
|
|
|
\value Apply An "Apply" button defined with the \l ApplyRole.
|
|
|
|
\value Reset A "Reset" button defined with the \l ResetRole.
|
|
|
|
\value RestoreDefaults A "Restore Defaults" button defined with the \l ResetRole.
|
|
|
|
\value Help A "Help" button defined with the \l HelpRole.
|
|
|
|
\value SaveAll A "Save All" button defined with the \l AcceptRole.
|
|
|
|
\value Yes A "Yes" button defined with the \l YesRole.
|
|
|
|
\value YesToAll A "Yes to All" button defined with the \l YesRole.
|
|
|
|
\value No A "No" button defined with the \l NoRole.
|
|
|
|
\value NoToAll A "No to All" button defined with the \l NoRole.
|
|
|
|
\value Abort An "Abort" button defined with the \l RejectRole.
|
|
|
|
\value Retry A "Retry" button defined with the \l AcceptRole.
|
|
|
|
\value Ignore An "Ignore" button defined with the \l AcceptRole.
|
|
|
|
|
|
|
|
\value NoButton An invalid button.
|
|
|
|
|
|
|
|
\omitvalue FirstButton
|
|
|
|
\omitvalue LastButton
|
|
|
|
|
|
|
|
The following values are obsolete:
|
|
|
|
|
|
|
|
\value YesAll Use YesToAll instead.
|
|
|
|
\value NoAll Use NoToAll instead.
|
|
|
|
\value Default Use the \c defaultButton argument of
|
|
|
|
information(), warning(), etc. instead, or call
|
|
|
|
setDefaultButton().
|
|
|
|
\value Escape Call setEscapeButton() instead.
|
|
|
|
\value FlagMask
|
|
|
|
\value ButtonMask
|
|
|
|
|
|
|
|
\sa ButtonRole, standardButtons
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\fn void QMessageBox::buttonClicked(QAbstractButton *button)
|
|
|
|
|
|
|
|
This signal is emitted whenever a button is clicked inside the QMessageBox.
|
|
|
|
The button that was clicked in returned in \a button.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
|
|
|
Constructs a message box with no text and no buttons. \a parent is
|
|
|
|
passed to the QDialog constructor.
|
|
|
|
|
|
|
|
On Mac OS X, if you want your message box to appear
|
|
|
|
as a Qt::Sheet of its \a parent, set the message box's
|
|
|
|
\l{setWindowModality()} {window modality} to Qt::WindowModal or use open().
|
|
|
|
Otherwise, the message box will be a standard dialog.
|
|
|
|
|
|
|
|
*/
|
|
|
|
QMessageBox::QMessageBox(QWidget *parent)
|
2016-10-22 16:13:22 +00:00
|
|
|
: QDialog(*new QMessageBoxPrivate, parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint)
|
2015-12-10 05:06:13 +02:00
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
d->init();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
Constructs a message box with the given \a icon, \a title, \a
|
|
|
|
text, and standard \a buttons. Standard or custom buttons can be
|
|
|
|
added at any time using addButton(). The \a parent and \a f
|
|
|
|
arguments are passed to the QDialog constructor.
|
|
|
|
|
|
|
|
The message box is an \l{Qt::ApplicationModal} {application modal}
|
|
|
|
dialog box.
|
|
|
|
|
|
|
|
On Mac OS X, if \a parent is not 0 and you want your message box
|
|
|
|
to appear as a Qt::Sheet of that parent, set the message box's
|
|
|
|
\l{setWindowModality()} {window modality} to Qt::WindowModal
|
|
|
|
(default). Otherwise, the message box will be a standard dialog.
|
|
|
|
|
|
|
|
\sa setWindowTitle(), setText(), setIcon(), setStandardButtons()
|
|
|
|
*/
|
|
|
|
QMessageBox::QMessageBox(Icon icon, const QString &title, const QString &text,
|
|
|
|
StandardButtons buttons, QWidget *parent,
|
|
|
|
Qt::WindowFlags f)
|
2016-10-22 16:13:22 +00:00
|
|
|
: QDialog(*new QMessageBoxPrivate, parent, f | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint)
|
2015-12-10 05:06:13 +02:00
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
d->init(title, text);
|
|
|
|
setIcon(icon);
|
|
|
|
if (buttons != NoButton)
|
|
|
|
setStandardButtons(buttons);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
Destroys the message box.
|
|
|
|
*/
|
|
|
|
QMessageBox::~QMessageBox()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
Adds the given \a button to the message box with the specified \a
|
|
|
|
role.
|
|
|
|
|
|
|
|
\sa removeButton(), button(), setStandardButtons()
|
|
|
|
*/
|
|
|
|
void QMessageBox::addButton(QAbstractButton *button, ButtonRole role)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
if (!button)
|
|
|
|
return;
|
|
|
|
removeButton(button);
|
|
|
|
d->buttonBox->addButton(button, (QDialogButtonBox::ButtonRole)role);
|
|
|
|
d->customButtonList.append(button);
|
|
|
|
d->autoAddOkButton = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
\overload
|
|
|
|
|
|
|
|
Creates a button with the given \a text, adds it to the message box for the
|
|
|
|
specified \a role, and returns it.
|
|
|
|
*/
|
|
|
|
QPushButton *QMessageBox::addButton(const QString& text, ButtonRole role)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
QPushButton *pushButton = new QPushButton(text);
|
|
|
|
addButton(pushButton, role);
|
|
|
|
d->updateSize();
|
|
|
|
return pushButton;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
\overload
|
|
|
|
|
|
|
|
Adds a standard \a button to the message box if it is valid to do so, and
|
|
|
|
returns the push button.
|
|
|
|
|
|
|
|
\sa setStandardButtons()
|
|
|
|
*/
|
|
|
|
QPushButton *QMessageBox::addButton(StandardButton button)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
QPushButton *pushButton = d->buttonBox->addButton((QDialogButtonBox::StandardButton)button);
|
|
|
|
if (pushButton)
|
|
|
|
d->autoAddOkButton = false;
|
|
|
|
return pushButton;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
Removes \a button from the button box without deleting it.
|
|
|
|
|
|
|
|
\sa addButton(), setStandardButtons()
|
|
|
|
*/
|
|
|
|
void QMessageBox::removeButton(QAbstractButton *button)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
d->customButtonList.removeAll(button);
|
|
|
|
if (d->escapeButton == button)
|
|
|
|
d->escapeButton = 0;
|
|
|
|
if (d->defaultButton == button)
|
|
|
|
d->defaultButton = 0;
|
|
|
|
d->buttonBox->removeButton(button);
|
|
|
|
d->updateSize();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\property QMessageBox::standardButtons
|
|
|
|
\brief collection of standard buttons in the message box
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
This property controls which standard buttons are used by the message box.
|
|
|
|
|
|
|
|
By default, this property contains no standard buttons.
|
|
|
|
|
|
|
|
\sa addButton()
|
|
|
|
*/
|
|
|
|
void QMessageBox::setStandardButtons(StandardButtons buttons)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
d->buttonBox->setStandardButtons(QDialogButtonBox::StandardButtons(int(buttons)));
|
|
|
|
|
|
|
|
QList<QAbstractButton *> buttonList = d->buttonBox->buttons();
|
|
|
|
if (!buttonList.contains(d->escapeButton))
|
|
|
|
d->escapeButton = 0;
|
|
|
|
if (!buttonList.contains(d->defaultButton))
|
|
|
|
d->defaultButton = 0;
|
|
|
|
d->autoAddOkButton = false;
|
|
|
|
d->updateSize();
|
|
|
|
}
|
|
|
|
|
|
|
|
QMessageBox::StandardButtons QMessageBox::standardButtons() const
|
|
|
|
{
|
|
|
|
Q_D(const QMessageBox);
|
|
|
|
return QMessageBox::StandardButtons(int(d->buttonBox->standardButtons()));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
Returns the standard button enum value corresponding to the given \a button,
|
|
|
|
or NoButton if the given \a button isn't a standard button.
|
|
|
|
|
|
|
|
\sa button(), standardButtons()
|
|
|
|
*/
|
|
|
|
QMessageBox::StandardButton QMessageBox::standardButton(QAbstractButton *button) const
|
|
|
|
{
|
|
|
|
Q_D(const QMessageBox);
|
|
|
|
return (QMessageBox::StandardButton)d->buttonBox->standardButton(button);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
Returns a pointer corresponding to the standard button \a which,
|
|
|
|
or 0 if the standard button doesn't exist in this message box.
|
|
|
|
|
|
|
|
\sa standardButtons, standardButton()
|
|
|
|
*/
|
|
|
|
QAbstractButton *QMessageBox::button(StandardButton which) const
|
|
|
|
{
|
|
|
|
Q_D(const QMessageBox);
|
|
|
|
return d->buttonBox->button(QDialogButtonBox::StandardButton(which));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
Returns the button that is activated when escape is pressed.
|
|
|
|
|
|
|
|
By default, QMessageBox attempts to automatically detect an
|
|
|
|
escape button as follows:
|
|
|
|
|
|
|
|
\list 1
|
|
|
|
\o If there is only one button, it is made the escape button.
|
|
|
|
\o If there is a \l Cancel button, it is made the escape button.
|
|
|
|
\o On Mac OS X only, if there is exactly one button with the role
|
|
|
|
QMessageBox::RejectRole, it is made the escape button.
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
When an escape button could not be automatically detected, pressing
|
|
|
|
\key Esc has no effect.
|
|
|
|
|
|
|
|
\sa addButton()
|
|
|
|
*/
|
|
|
|
QAbstractButton *QMessageBox::escapeButton() const
|
|
|
|
{
|
|
|
|
Q_D(const QMessageBox);
|
|
|
|
return d->escapeButton;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
Sets the button that gets activated when the \key Escape key is
|
|
|
|
pressed to \a button.
|
|
|
|
|
|
|
|
\sa addButton(), clickedButton()
|
|
|
|
*/
|
|
|
|
void QMessageBox::setEscapeButton(QAbstractButton *button)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
if (d->buttonBox->buttons().contains(button))
|
|
|
|
d->escapeButton = button;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.3
|
|
|
|
|
|
|
|
Sets the buttons that gets activated when the \key Escape key is
|
|
|
|
pressed to \a button.
|
|
|
|
|
|
|
|
\sa addButton(), clickedButton()
|
|
|
|
*/
|
|
|
|
void QMessageBox::setEscapeButton(QMessageBox::StandardButton button)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
setEscapeButton(d->buttonBox->button(QDialogButtonBox::StandardButton(button)));
|
|
|
|
}
|
|
|
|
|
|
|
|
void QMessageBoxPrivate::detectEscapeButton()
|
|
|
|
{
|
|
|
|
if (escapeButton) { // escape button explicitly set
|
|
|
|
detectedEscapeButton = escapeButton;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Cancel button automatically becomes escape button
|
|
|
|
detectedEscapeButton = buttonBox->button(QDialogButtonBox::Cancel);
|
|
|
|
if (detectedEscapeButton)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// If there is only one button, make it the escape button
|
|
|
|
const QList<QAbstractButton *> buttons = buttonBox->buttons();
|
|
|
|
if (buttons.count() == 1) {
|
|
|
|
detectedEscapeButton = buttons.first();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// if the message box has one RejectRole button, make it the escape button
|
|
|
|
for (int i = 0; i < buttons.count(); i++) {
|
|
|
|
if (buttonBox->buttonRole(buttons.at(i)) == QDialogButtonBox::RejectRole) {
|
|
|
|
if (detectedEscapeButton) { // already detected!
|
|
|
|
detectedEscapeButton = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
detectedEscapeButton = buttons.at(i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (detectedEscapeButton)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// if the message box has one NoRole button, make it the escape button
|
|
|
|
for (int i = 0; i < buttons.count(); i++) {
|
|
|
|
if (buttonBox->buttonRole(buttons.at(i)) == QDialogButtonBox::NoRole) {
|
|
|
|
if (detectedEscapeButton) { // already detected!
|
|
|
|
detectedEscapeButton = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
detectedEscapeButton = buttons.at(i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
Returns the button that was clicked by the user,
|
|
|
|
or 0 if the user hit the \key Esc key and
|
|
|
|
no \l{setEscapeButton()}{escape button} was set.
|
|
|
|
|
|
|
|
If exec() hasn't been called yet, returns 0.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
\snippet doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp 3
|
|
|
|
|
|
|
|
\sa standardButton(), button()
|
|
|
|
*/
|
|
|
|
QAbstractButton *QMessageBox::clickedButton() const
|
|
|
|
{
|
|
|
|
Q_D(const QMessageBox);
|
|
|
|
return d->clickedButton;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
Returns the button that should be the message box's
|
|
|
|
\l{QPushButton::setDefault()}{default button}. Returns 0
|
|
|
|
if no default button was set.
|
|
|
|
|
|
|
|
\sa addButton(), QPushButton::setDefault()
|
|
|
|
*/
|
|
|
|
QPushButton *QMessageBox::defaultButton() const
|
|
|
|
{
|
|
|
|
Q_D(const QMessageBox);
|
|
|
|
return d->defaultButton;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
Sets the message box's \l{QPushButton::setDefault()}{default button}
|
|
|
|
to \a button.
|
|
|
|
|
|
|
|
\sa addButton(), QPushButton::setDefault()
|
|
|
|
*/
|
|
|
|
void QMessageBox::setDefaultButton(QPushButton *button)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
if (!d->buttonBox->buttons().contains(button))
|
|
|
|
return;
|
|
|
|
d->defaultButton = button;
|
|
|
|
button->setDefault(true);
|
|
|
|
button->setFocus();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.3
|
|
|
|
|
|
|
|
Sets the message box's \l{QPushButton::setDefault()}{default button}
|
|
|
|
to \a button.
|
|
|
|
|
|
|
|
\sa addButton(), QPushButton::setDefault()
|
|
|
|
*/
|
|
|
|
void QMessageBox::setDefaultButton(QMessageBox::StandardButton button)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
setDefaultButton(d->buttonBox->button(QDialogButtonBox::StandardButton(button)));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\property QMessageBox::text
|
|
|
|
\brief the message box text to be displayed.
|
|
|
|
|
|
|
|
The text will be interpreted either as a plain text or as rich text,
|
|
|
|
depending on the text format setting (\l QMessageBox::textFormat).
|
|
|
|
The default setting is Qt::AutoText, i.e., the message box will try
|
|
|
|
to auto-detect the format of the text.
|
|
|
|
|
|
|
|
The default value of this property is an empty string.
|
|
|
|
|
|
|
|
\sa textFormat, QMessageBox::informativeText, QMessageBox::detailedText
|
|
|
|
*/
|
|
|
|
QString QMessageBox::text() const
|
|
|
|
{
|
|
|
|
Q_D(const QMessageBox);
|
|
|
|
return d->label->text();
|
|
|
|
}
|
|
|
|
|
|
|
|
void QMessageBox::setText(const QString &text)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
d->label->setText(text);
|
|
|
|
d->label->setWordWrap(d->label->textFormat() == Qt::RichText
|
|
|
|
|| (d->label->textFormat() == Qt::AutoText && Qt::mightBeRichText(text)));
|
|
|
|
d->updateSize();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\enum QMessageBox::Icon
|
|
|
|
|
|
|
|
This enum has the following values:
|
|
|
|
|
|
|
|
\value NoIcon the message box does not have any icon.
|
|
|
|
|
|
|
|
\value Question an icon indicating that
|
|
|
|
the message is asking a question.
|
|
|
|
|
|
|
|
\value Information an icon indicating that
|
|
|
|
the message is nothing out of the ordinary.
|
|
|
|
|
|
|
|
\value Warning an icon indicating that the
|
|
|
|
message is a warning, but can be dealt with.
|
|
|
|
|
|
|
|
\value Critical an icon indicating that
|
|
|
|
the message represents a critical problem.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\property QMessageBox::icon
|
|
|
|
\brief the message box's icon
|
|
|
|
|
|
|
|
The icon of the message box can be specified with one of the
|
|
|
|
values:
|
|
|
|
|
|
|
|
\list
|
|
|
|
\o QMessageBox::NoIcon
|
|
|
|
\o QMessageBox::Question
|
|
|
|
\o QMessageBox::Information
|
|
|
|
\o QMessageBox::Warning
|
|
|
|
\o QMessageBox::Critical
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
The default is QMessageBox::NoIcon.
|
|
|
|
|
|
|
|
The pixmap used to display the actual icon depends on the current
|
|
|
|
\l{QWidget::style()} {GUI style}. You can also set a custom pixmap
|
|
|
|
for the icon by setting the \l{QMessageBox::iconPixmap} {icon
|
|
|
|
pixmap} property.
|
|
|
|
|
|
|
|
\sa iconPixmap
|
|
|
|
*/
|
|
|
|
QMessageBox::Icon QMessageBox::icon() const
|
|
|
|
{
|
|
|
|
Q_D(const QMessageBox);
|
|
|
|
return d->icon;
|
|
|
|
}
|
|
|
|
|
|
|
|
void QMessageBox::setIcon(Icon icon)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
setIconPixmap(QMessageBoxPrivate::standardIcon((QMessageBox::Icon)icon,
|
|
|
|
this));
|
|
|
|
d->icon = icon;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\property QMessageBox::iconPixmap
|
|
|
|
\brief the current icon
|
|
|
|
|
|
|
|
The icon currently used by the message box. Note that it's often
|
|
|
|
hard to draw one pixmap that looks appropriate in all GUI styles;
|
|
|
|
you may want to supply a different pixmap for each platform.
|
|
|
|
|
|
|
|
By default, this property is undefined.
|
|
|
|
|
|
|
|
\sa icon
|
|
|
|
*/
|
|
|
|
QPixmap QMessageBox::iconPixmap() const
|
|
|
|
{
|
|
|
|
Q_D(const QMessageBox);
|
|
|
|
if (d->iconLabel && d->iconLabel->pixmap())
|
|
|
|
return *d->iconLabel->pixmap();
|
|
|
|
return QPixmap();
|
|
|
|
}
|
|
|
|
|
|
|
|
void QMessageBox::setIconPixmap(const QPixmap &pixmap)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
d->iconLabel->setPixmap(pixmap);
|
|
|
|
d->updateSize();
|
|
|
|
d->icon = NoIcon;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\property QMessageBox::textFormat
|
|
|
|
\brief the format of the text displayed by the message box
|
|
|
|
|
|
|
|
The current text format used by the message box. See the \l
|
|
|
|
Qt::TextFormat enum for an explanation of the possible options.
|
|
|
|
|
|
|
|
The default format is Qt::AutoText.
|
|
|
|
|
|
|
|
\sa setText()
|
|
|
|
*/
|
|
|
|
Qt::TextFormat QMessageBox::textFormat() const
|
|
|
|
{
|
|
|
|
Q_D(const QMessageBox);
|
|
|
|
return d->label->textFormat();
|
|
|
|
}
|
|
|
|
|
|
|
|
void QMessageBox::setTextFormat(Qt::TextFormat format)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
d->label->setTextFormat(format);
|
|
|
|
d->label->setWordWrap(format == Qt::RichText
|
|
|
|
|| (format == Qt::AutoText && Qt::mightBeRichText(d->label->text())));
|
|
|
|
d->updateSize();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\reimp
|
|
|
|
*/
|
|
|
|
bool QMessageBox::event(QEvent *e)
|
|
|
|
{
|
|
|
|
bool result =QDialog::event(e);
|
|
|
|
switch (e->type()) {
|
|
|
|
case QEvent::LayoutRequest:
|
|
|
|
d_func()->updateSize();
|
|
|
|
break;
|
|
|
|
case QEvent::LanguageChange:
|
|
|
|
d_func()->retranslateStrings();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\reimp
|
|
|
|
*/
|
|
|
|
void QMessageBox::closeEvent(QCloseEvent *e)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
if (!d->detectedEscapeButton) {
|
|
|
|
e->ignore();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
QDialog::closeEvent(e);
|
|
|
|
d->clickedButton = d->detectedEscapeButton;
|
|
|
|
setResult(d->execReturnCode(d->detectedEscapeButton));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\reimp
|
|
|
|
*/
|
|
|
|
void QMessageBox::changeEvent(QEvent *ev)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
switch (ev->type()) {
|
|
|
|
case QEvent::StyleChange:
|
|
|
|
{
|
|
|
|
if (d->icon != NoIcon)
|
|
|
|
setIcon(d->icon);
|
|
|
|
Qt::TextInteractionFlags flags(style()->styleHint(QStyle::SH_MessageBox_TextInteractionFlags, 0, this));
|
|
|
|
d->label->setTextInteractionFlags(flags);
|
|
|
|
d->buttonBox->setCenterButtons(style()->styleHint(QStyle::SH_MessageBox_CenterButtons, 0, this));
|
|
|
|
if (d->informativeLabel)
|
|
|
|
d->informativeLabel->setTextInteractionFlags(flags);
|
|
|
|
// intentional fall through
|
|
|
|
}
|
|
|
|
case QEvent::FontChange:
|
|
|
|
case QEvent::ApplicationFontChange:
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
QDialog::changeEvent(ev);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\reimp
|
|
|
|
*/
|
|
|
|
void QMessageBox::keyPressEvent(QKeyEvent *e)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
2016-09-18 23:41:08 +00:00
|
|
|
if (e->key() == Qt::Key_Escape) {
|
|
|
|
if (d->detectedEscapeButton) {
|
|
|
|
d->detectedEscapeButton->click();
|
2015-12-10 05:06:13 +02:00
|
|
|
}
|
2016-09-18 23:41:08 +00:00
|
|
|
return;
|
|
|
|
}
|
2015-12-10 05:06:13 +02:00
|
|
|
|
|
|
|
#ifndef QT_NO_SHORTCUT
|
|
|
|
if (!(e->modifiers() & Qt::AltModifier)) {
|
|
|
|
int key = e->key() & ~((int)Qt::MODIFIER_MASK|(int)Qt::UNICODE_ACCEL);
|
|
|
|
if (key) {
|
|
|
|
const QList<QAbstractButton *> buttons = d->buttonBox->buttons();
|
|
|
|
for (int i = 0; i < buttons.count(); ++i) {
|
|
|
|
QAbstractButton *pb = buttons.at(i);
|
|
|
|
int acc = pb->shortcut() & ~((int)Qt::MODIFIER_MASK|(int)Qt::UNICODE_ACCEL);
|
|
|
|
if (acc == key) {
|
|
|
|
pb->animateClick();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
QDialog::keyPressEvent(e);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\overload
|
|
|
|
|
|
|
|
Opens the dialog and connects its finished() or buttonClicked() signal to
|
|
|
|
the slot specified by \a receiver and \a member. If the slot in \a member
|
|
|
|
has a pointer for its first parameter the connection is to buttonClicked(),
|
|
|
|
otherwise the connection is to finished().
|
|
|
|
|
|
|
|
The signal will be disconnected from the slot when the dialog is closed.
|
|
|
|
*/
|
|
|
|
void QMessageBox::open(QObject *receiver, const char *member)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
const char *signal = member && strchr(member, '*') ? SIGNAL(buttonClicked(QAbstractButton*))
|
|
|
|
: SIGNAL(finished(int));
|
|
|
|
connect(this, signal, receiver, member);
|
|
|
|
d->signalToDisconnectOnClose = signal;
|
|
|
|
d->receiverToDisconnectOnClose = receiver;
|
|
|
|
d->memberToDisconnectOnClose = member;
|
|
|
|
QDialog::open();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.5
|
|
|
|
|
|
|
|
Returns a list of all the buttons that have been added to the message box.
|
|
|
|
|
|
|
|
\sa buttonRole(), addButton(), removeButton()
|
|
|
|
*/
|
|
|
|
QList<QAbstractButton *> QMessageBox::buttons() const
|
|
|
|
{
|
|
|
|
Q_D(const QMessageBox);
|
|
|
|
return d->buttonBox->buttons();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.5
|
|
|
|
|
|
|
|
Returns the button role for the specified \a button. This function returns
|
|
|
|
\l InvalidRole if \a button is 0 or has not been added to the message box.
|
|
|
|
|
|
|
|
\sa buttons(), addButton()
|
|
|
|
*/
|
|
|
|
QMessageBox::ButtonRole QMessageBox::buttonRole(QAbstractButton *button) const
|
|
|
|
{
|
|
|
|
Q_D(const QMessageBox);
|
|
|
|
return QMessageBox::ButtonRole(d->buttonBox->buttonRole(button));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\reimp
|
|
|
|
*/
|
|
|
|
void QMessageBox::showEvent(QShowEvent *e)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
if (d->autoAddOkButton) {
|
|
|
|
addButton(Ok);
|
|
|
|
}
|
|
|
|
if (d->detailsButton)
|
|
|
|
addButton(d->detailsButton, QMessageBox::ActionRole);
|
|
|
|
d->detectEscapeButton();
|
|
|
|
d->updateSize();
|
|
|
|
|
|
|
|
#ifndef QT_NO_ACCESSIBILITY
|
|
|
|
QAccessible::updateAccessibility(this, 0, QAccessible::Alert);
|
|
|
|
#endif
|
|
|
|
QDialog::showEvent(e);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static QMessageBox::StandardButton showNewMessageBox(QWidget *parent,
|
|
|
|
QMessageBox::Icon icon,
|
|
|
|
const QString& title, const QString& text,
|
|
|
|
QMessageBox::StandardButtons buttons,
|
|
|
|
QMessageBox::StandardButton defaultButton)
|
|
|
|
{
|
|
|
|
QMessageBox msgBox(icon, title, text, QMessageBox::NoButton, parent);
|
|
|
|
QDialogButtonBox *buttonBox = msgBox.findChild<QDialogButtonBox*>();
|
|
|
|
Q_ASSERT(buttonBox != 0);
|
|
|
|
|
|
|
|
uint mask = QMessageBox::FirstButton;
|
|
|
|
while (mask <= QMessageBox::LastButton) {
|
|
|
|
uint sb = buttons & mask;
|
|
|
|
mask <<= 1;
|
|
|
|
if (!sb)
|
|
|
|
continue;
|
|
|
|
QPushButton *button = msgBox.addButton((QMessageBox::StandardButton)sb);
|
|
|
|
// Choose the first accept role as the default
|
|
|
|
if (msgBox.defaultButton())
|
|
|
|
continue;
|
|
|
|
if ((defaultButton == QMessageBox::NoButton && buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole)
|
|
|
|
|| (defaultButton != QMessageBox::NoButton && sb == uint(defaultButton)))
|
|
|
|
msgBox.setDefaultButton(button);
|
|
|
|
}
|
|
|
|
if (msgBox.exec() == -1)
|
|
|
|
return QMessageBox::Cancel;
|
|
|
|
return msgBox.standardButton(msgBox.clickedButton());
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
Opens an information message box with the given \a title and
|
|
|
|
\a text in front of the specified \a parent widget.
|
|
|
|
|
|
|
|
The standard \a buttons are added to the message box.
|
|
|
|
\a defaultButton specifies the button used when \key Enter is pressed.
|
|
|
|
\a defaultButton must refer to a button that was given in \a buttons.
|
|
|
|
If \a defaultButton is QMessageBox::NoButton, QMessageBox
|
|
|
|
chooses a suitable default automatically.
|
|
|
|
|
|
|
|
Returns the identity of the standard button that was clicked. If
|
|
|
|
\key Esc was pressed instead, the \l{Default and Escape Keys}
|
|
|
|
{escape button} is returned.
|
|
|
|
|
|
|
|
The message box is an \l{Qt::ApplicationModal}{application modal}
|
|
|
|
dialog box.
|
|
|
|
|
|
|
|
\warning Do not delete \a parent during the execution of the dialog.
|
|
|
|
If you want to do this, you should create the dialog
|
|
|
|
yourself using one of the QMessageBox constructors.
|
|
|
|
|
|
|
|
\sa question(), warning(), critical()
|
|
|
|
*/
|
|
|
|
QMessageBox::StandardButton QMessageBox::information(QWidget *parent, const QString &title,
|
|
|
|
const QString& text, StandardButtons buttons,
|
|
|
|
StandardButton defaultButton)
|
|
|
|
{
|
|
|
|
return showNewMessageBox(parent, Information, title, text, buttons,
|
|
|
|
defaultButton);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
Opens a question message box with the given \a title and \a
|
|
|
|
text in front of the specified \a parent widget.
|
|
|
|
|
|
|
|
The standard \a buttons are added to the message box. \a
|
|
|
|
defaultButton specifies the button used when \key Enter is
|
|
|
|
pressed. \a defaultButton must refer to a button that was given in \a buttons.
|
|
|
|
If \a defaultButton is QMessageBox::NoButton, QMessageBox
|
|
|
|
chooses a suitable default automatically.
|
|
|
|
|
|
|
|
Returns the identity of the standard button that was clicked. If
|
|
|
|
\key Esc was pressed instead, the \l{Default and Escape Keys}
|
|
|
|
{escape button} is returned.
|
|
|
|
|
|
|
|
The message box is an \l{Qt::ApplicationModal} {application modal}
|
|
|
|
dialog box.
|
|
|
|
|
|
|
|
\warning Do not delete \a parent during the execution of the dialog.
|
|
|
|
If you want to do this, you should create the dialog
|
|
|
|
yourself using one of the QMessageBox constructors.
|
|
|
|
|
|
|
|
\sa information(), warning(), critical()
|
|
|
|
*/
|
|
|
|
QMessageBox::StandardButton QMessageBox::question(QWidget *parent, const QString &title,
|
|
|
|
const QString& text, StandardButtons buttons,
|
|
|
|
StandardButton defaultButton)
|
|
|
|
{
|
|
|
|
return showNewMessageBox(parent, Question, title, text, buttons, defaultButton);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
Opens a warning message box with the given \a title and \a
|
|
|
|
text in front of the specified \a parent widget.
|
|
|
|
|
|
|
|
The standard \a buttons are added to the message box. \a
|
|
|
|
defaultButton specifies the button used when \key Enter is
|
|
|
|
pressed. \a defaultButton must refer to a button that was given in \a buttons.
|
|
|
|
If \a defaultButton is QMessageBox::NoButton, QMessageBox
|
|
|
|
chooses a suitable default automatically.
|
|
|
|
|
|
|
|
Returns the identity of the standard button that was clicked. If
|
|
|
|
\key Esc was pressed instead, the \l{Default and Escape Keys}
|
|
|
|
{escape button} is returned.
|
|
|
|
|
|
|
|
The message box is an \l{Qt::ApplicationModal} {application modal}
|
|
|
|
dialog box.
|
|
|
|
|
|
|
|
\warning Do not delete \a parent during the execution of the dialog.
|
|
|
|
If you want to do this, you should create the dialog
|
|
|
|
yourself using one of the QMessageBox constructors.
|
|
|
|
|
|
|
|
\sa question(), information(), critical()
|
|
|
|
*/
|
|
|
|
QMessageBox::StandardButton QMessageBox::warning(QWidget *parent, const QString &title,
|
|
|
|
const QString& text, StandardButtons buttons,
|
|
|
|
StandardButton defaultButton)
|
|
|
|
{
|
|
|
|
return showNewMessageBox(parent, Warning, title, text, buttons, defaultButton);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
Opens a critical message box with the given \a title and \a
|
|
|
|
text in front of the specified \a parent widget.
|
|
|
|
|
|
|
|
The standard \a buttons are added to the message box. \a
|
|
|
|
defaultButton specifies the button used when \key Enter is
|
|
|
|
pressed. \a defaultButton must refer to a button that was given in \a buttons.
|
|
|
|
If \a defaultButton is QMessageBox::NoButton, QMessageBox
|
|
|
|
chooses a suitable default automatically.
|
|
|
|
|
|
|
|
Returns the identity of the standard button that was clicked. If
|
|
|
|
\key Esc was pressed instead, the \l{Default and Escape Keys}
|
|
|
|
{escape button} is returned.
|
|
|
|
|
|
|
|
The message box is an \l{Qt::ApplicationModal} {application modal}
|
|
|
|
dialog box.
|
|
|
|
|
|
|
|
\warning Do not delete \a parent during the execution of the dialog.
|
|
|
|
If you want to do this, you should create the dialog
|
|
|
|
yourself using one of the QMessageBox constructors.
|
|
|
|
|
|
|
|
\sa question(), warning(), information()
|
|
|
|
*/
|
|
|
|
QMessageBox::StandardButton QMessageBox::critical(QWidget *parent, const QString &title,
|
|
|
|
const QString& text, StandardButtons buttons,
|
|
|
|
StandardButton defaultButton)
|
|
|
|
{
|
|
|
|
return showNewMessageBox(parent, Critical, title, text, buttons, defaultButton);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
Displays a simple about box with title \a title and text \a
|
|
|
|
text. The about box's parent is \a parent.
|
|
|
|
|
|
|
|
about() looks for a suitable icon in four locations:
|
|
|
|
|
|
|
|
\list 1
|
|
|
|
\o It prefers \link QWidget::windowIcon() parent->icon() \endlink
|
|
|
|
if that exists.
|
|
|
|
\o If not, it tries the top-level widget containing \a parent.
|
|
|
|
\o If that fails, it tries the \link
|
|
|
|
QApplication::activeWindow() active window. \endlink
|
|
|
|
\o As a last resort it uses the Information icon.
|
|
|
|
\endlist
|
|
|
|
|
|
|
|
The about box has a single button labelled "OK". On Mac OS X, the
|
|
|
|
about box is popped up as a modeless window; on other platforms,
|
|
|
|
it is currently application modal.
|
|
|
|
|
|
|
|
\sa QWidget::windowIcon(), QApplication::activeWindow()
|
|
|
|
*/
|
|
|
|
void QMessageBox::about(QWidget *parent, const QString &title, const QString &text)
|
|
|
|
{
|
2016-09-18 23:41:08 +00:00
|
|
|
QMessageBox *msgBox = new QMessageBox(Information, title, text, 0, parent);
|
2015-12-10 05:06:13 +02:00
|
|
|
msgBox->setAttribute(Qt::WA_DeleteOnClose);
|
|
|
|
QIcon icon = msgBox->windowIcon();
|
|
|
|
QSize size = icon.actualSize(QSize(64, 64));
|
|
|
|
msgBox->setIconPixmap(icon.pixmap(size));
|
|
|
|
|
|
|
|
msgBox->exec();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
Displays a simple message box about Qt, with the given \a title
|
|
|
|
and centered over \a parent (if \a parent is not 0). The message
|
|
|
|
includes the version number of Qt being used by the application.
|
|
|
|
|
|
|
|
This is useful for inclusion in the \gui Help menu of an application,
|
|
|
|
as shown in the \l{mainwindows/menus}{Menus} example.
|
|
|
|
|
|
|
|
QApplication provides this functionality as a slot.
|
|
|
|
|
|
|
|
On Mac OS X, the about box is popped up as a modeless window; on
|
|
|
|
other platforms, it is currently application modal.
|
|
|
|
|
|
|
|
\sa QApplication::aboutQt()
|
|
|
|
*/
|
|
|
|
void QMessageBox::aboutQt(QWidget *parent, const QString &title)
|
|
|
|
{
|
|
|
|
QString translatedTextAboutQtCaption;
|
|
|
|
translatedTextAboutQtCaption = QMessageBox::tr(
|
|
|
|
"<h3>About Qt</h3>"
|
|
|
|
"<p>This program uses Qt version %1.</p>"
|
|
|
|
).arg(QLatin1String(QT_VERSION_STR));
|
|
|
|
QString translatedTextAboutQtText;
|
|
|
|
translatedTextAboutQtText = QMessageBox::tr(
|
|
|
|
"<p>Qt is a C++ toolkit for cross-platform application "
|
|
|
|
"development.</p>"
|
|
|
|
"<p>Qt provides single-source portability across all major desktop "
|
|
|
|
"operating systems. It is also available for embedded Linux and other "
|
|
|
|
"embedded and mobile operating systems.</p>"
|
|
|
|
"<p>Qt is available under three different licensing options designed "
|
|
|
|
"to accommodate the needs of our various users.</p>"
|
|
|
|
"<p>Qt licensed under our commercial license agreement is appropriate "
|
|
|
|
"for development of proprietary/commercial software where you do not "
|
|
|
|
"want to share any source code with third parties or otherwise cannot "
|
|
|
|
"comply with the terms of the GNU LGPL version 3 or GNU LGPL version 2.1.</p>"
|
|
|
|
"<p>Qt licensed under the GNU LGPL version 3 is appropriate for the "
|
|
|
|
"development of Qt applications provided you can comply with the terms "
|
|
|
|
"and conditions of the GNU LGPL version 3.</p>"
|
|
|
|
"<p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the "
|
|
|
|
"development of Qt applications provided you can comply with the terms "
|
|
|
|
"and conditions of the GNU LGPL version 2.1.</p>"
|
|
|
|
"<p>Please see <a href=\"http://%2/\">%2</a> "
|
|
|
|
"for an overview of Qt licensing.</p>"
|
|
|
|
"<p>Copyright (C) %1 The Qt Company Ltd and other "
|
|
|
|
"contributors.</p>"
|
|
|
|
"<p>Qt and the Qt logo are trademarks of The Qt Company Ltd.</p>"
|
|
|
|
"<p>Qt is The Qt Company Ltd product developed as an open source "
|
|
|
|
"project. See <a href=\"http://%3/\">%3</a> for more information.</p>"
|
|
|
|
).arg(QLatin1String("2015"),
|
|
|
|
QLatin1String("qt.io/licensing"),
|
|
|
|
QLatin1String("qt.io"));
|
|
|
|
QMessageBox *msgBox = new QMessageBox(parent);
|
|
|
|
msgBox->setAttribute(Qt::WA_DeleteOnClose);
|
|
|
|
msgBox->setWindowTitle(title.isEmpty() ? tr("About Qt") : title);
|
|
|
|
msgBox->setText(translatedTextAboutQtCaption);
|
|
|
|
msgBox->setInformativeText(translatedTextAboutQtText);
|
|
|
|
|
|
|
|
QPixmap pm(QLatin1String(":/trolltech/qmessagebox/images/qtlogo-64.png"));
|
|
|
|
if (!pm.isNull())
|
|
|
|
msgBox->setIconPixmap(pm);
|
|
|
|
|
|
|
|
msgBox->exec();
|
|
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Source and binary compatibility routines for 4.0 and 4.1
|
|
|
|
|
|
|
|
void QMessageBoxPrivate::retranslateStrings()
|
|
|
|
{
|
|
|
|
#ifndef QT_NO_TEXTEDIT
|
|
|
|
if (detailsButton)
|
|
|
|
detailsButton->setLabel(detailsText->isHidden() ? ShowLabel : HideLabel);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef QT_NO_TEXTEDIT
|
|
|
|
/*!
|
|
|
|
\property QMessageBox::detailedText
|
|
|
|
\brief the text to be displayed in the details area.
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
The text will be interpreted as a plain text.
|
|
|
|
|
|
|
|
By default, this property contains an empty string.
|
|
|
|
|
|
|
|
\sa QMessageBox::text, QMessageBox::informativeText
|
|
|
|
*/
|
|
|
|
QString QMessageBox::detailedText() const
|
|
|
|
{
|
|
|
|
Q_D(const QMessageBox);
|
|
|
|
return d->detailsText ? d->detailsText->text() : QString();
|
|
|
|
}
|
|
|
|
|
|
|
|
void QMessageBox::setDetailedText(const QString &text)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
if (text.isEmpty()) {
|
|
|
|
delete d->detailsText;
|
|
|
|
d->detailsText = 0;
|
|
|
|
removeButton(d->detailsButton);
|
|
|
|
delete d->detailsButton;
|
|
|
|
d->detailsButton = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!d->detailsText) {
|
|
|
|
d->detailsText = new QMessageBoxDetailsText(this);
|
|
|
|
QGridLayout* grid = qobject_cast<QGridLayout*>(layout());
|
|
|
|
if (grid)
|
|
|
|
grid->addWidget(d->detailsText, grid->rowCount(), 0, 1, grid->columnCount());
|
|
|
|
d->detailsText->hide();
|
|
|
|
}
|
|
|
|
if (!d->detailsButton)
|
|
|
|
d->detailsButton = new DetailButton(this);
|
|
|
|
d->detailsText->setText(text);
|
|
|
|
}
|
|
|
|
#endif // QT_NO_TEXTEDIT
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\property QMessageBox::informativeText
|
|
|
|
|
|
|
|
\brief the informative text that provides a fuller description for
|
|
|
|
the message
|
|
|
|
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
Infromative text can be used to expand upon the text() to give more
|
|
|
|
information to the user. On the Mac, this text appears in small
|
|
|
|
system font below the text(). On other platforms, it is simply
|
|
|
|
appended to the existing text.
|
|
|
|
|
|
|
|
By default, this property contains an empty string.
|
|
|
|
|
|
|
|
\sa QMessageBox::text, QMessageBox::detailedText
|
|
|
|
*/
|
|
|
|
QString QMessageBox::informativeText() const
|
|
|
|
{
|
|
|
|
Q_D(const QMessageBox);
|
|
|
|
return d->informativeLabel ? d->informativeLabel->text() : QString();
|
|
|
|
}
|
|
|
|
|
|
|
|
void QMessageBox::setInformativeText(const QString &text)
|
|
|
|
{
|
|
|
|
Q_D(QMessageBox);
|
|
|
|
if (text.isEmpty()) {
|
|
|
|
layout()->removeWidget(d->informativeLabel);
|
|
|
|
delete d->informativeLabel;
|
|
|
|
d->informativeLabel = 0;
|
|
|
|
d->label->setContentsMargins(2, 0, 0, 0);
|
|
|
|
d->updateSize();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!d->informativeLabel) {
|
|
|
|
QLabel *label = new QLabel(this);
|
|
|
|
label->setObjectName(QLatin1String("qt_msgbox_informativelabel"));
|
|
|
|
label->setTextInteractionFlags(Qt::TextInteractionFlags(style()->styleHint(QStyle::SH_MessageBox_TextInteractionFlags, 0, this)));
|
|
|
|
label->setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
|
|
|
label->setOpenExternalLinks(true);
|
|
|
|
label->setWordWrap(true);
|
|
|
|
d->label->setContentsMargins(2, 0, 0, 0);
|
|
|
|
label->setContentsMargins(2, 0, 0, 6);
|
|
|
|
label->setIndent(9);
|
|
|
|
label->setWordWrap(true);
|
|
|
|
QGridLayout *grid = static_cast<QGridLayout *>(layout());
|
|
|
|
grid->addWidget(label, 1, 1, 1, 1);
|
|
|
|
d->informativeLabel = label;
|
|
|
|
}
|
|
|
|
d->informativeLabel->setText(text);
|
|
|
|
|
|
|
|
d->updateSize();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\since 4.2
|
|
|
|
|
|
|
|
This function shadows QWidget::setWindowModality().
|
|
|
|
|
|
|
|
Sets the modality of the message box to \a windowModality.
|
|
|
|
|
|
|
|
On Mac OS X, if the modality is set to Qt::WindowModal and the message box
|
|
|
|
has a parent, then the message box will be a Qt::Sheet, otherwise the
|
|
|
|
message box will be a standard dialog.
|
|
|
|
*/
|
|
|
|
void QMessageBox::setWindowModality(Qt::WindowModality windowModality)
|
|
|
|
{
|
|
|
|
QDialog::setWindowModality(windowModality);
|
|
|
|
|
|
|
|
if (parentWidget() && windowModality == Qt::WindowModal)
|
|
|
|
setParent(parentWidget(), Qt::Sheet);
|
|
|
|
else
|
|
|
|
setParent(parentWidget(), Qt::Dialog);
|
|
|
|
setDefaultButton(d_func()->defaultButton);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QPixmap QMessageBoxPrivate::standardIcon(QMessageBox::Icon icon, QMessageBox *mb)
|
|
|
|
{
|
|
|
|
QStyle *style = mb ? mb->style() : QApplication::style();
|
|
|
|
int iconSize = style->pixelMetric(QStyle::PM_MessageBoxIconSize, 0, mb);
|
|
|
|
QIcon tmpIcon;
|
|
|
|
switch (icon) {
|
|
|
|
case QMessageBox::Information:
|
|
|
|
tmpIcon = style->standardIcon(QStyle::SP_MessageBoxInformation, 0, mb);
|
|
|
|
break;
|
|
|
|
case QMessageBox::Warning:
|
|
|
|
tmpIcon = style->standardIcon(QStyle::SP_MessageBoxWarning, 0, mb);
|
|
|
|
break;
|
|
|
|
case QMessageBox::Critical:
|
|
|
|
tmpIcon = style->standardIcon(QStyle::SP_MessageBoxCritical, 0, mb);
|
|
|
|
break;
|
|
|
|
case QMessageBox::Question:
|
|
|
|
tmpIcon = style->standardIcon(QStyle::SP_MessageBoxQuestion, 0, mb);
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (!tmpIcon.isNull())
|
|
|
|
return tmpIcon.pixmap(iconSize, iconSize);
|
|
|
|
return QPixmap();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\obsolete
|
|
|
|
|
|
|
|
Returns the pixmap used for a standard icon. This allows the
|
|
|
|
pixmaps to be used in more complex message boxes. \a icon
|
|
|
|
specifies the required icon, e.g. QMessageBox::Question,
|
|
|
|
QMessageBox::Information, QMessageBox::Warning or
|
|
|
|
QMessageBox::Critical.
|
|
|
|
|
|
|
|
Call QStyle::standardIcon() with QStyle::SP_MessageBoxInformation etc.
|
|
|
|
instead.
|
|
|
|
*/
|
|
|
|
|
|
|
|
QPixmap QMessageBox::standardIcon(Icon icon)
|
|
|
|
{
|
|
|
|
return QMessageBoxPrivate::standardIcon(icon, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\typedef QMessageBox::Button
|
|
|
|
\obsolete
|
|
|
|
|
|
|
|
Use QMessageBox::StandardButton instead.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\fn int QMessageBox::exec()
|
|
|
|
|
|
|
|
Shows the message box as a \l{QDialog#Modal Dialogs}{modal dialog},
|
|
|
|
blocking until the user closes it.
|
|
|
|
|
|
|
|
When using a QMessageBox with standard buttons, this functions returns a
|
|
|
|
\l StandardButton value indicating the standard button that was clicked.
|
|
|
|
When using QMessageBox with custom buttons, this function returns an
|
|
|
|
opaque value; use clickedButton() to determine which button was clicked.
|
|
|
|
|
|
|
|
\note The result() function returns also \l StandardButton value instead of \l QDialog::DialogCode
|
|
|
|
|
|
|
|
Users cannot interact with any other window in the same
|
|
|
|
application until they close the dialog, either by clicking a
|
|
|
|
button or by using a mechanism provided by the window system.
|
|
|
|
|
|
|
|
\sa show(), result()
|
|
|
|
*/
|
|
|
|
|
|
|
|
QT_END_NAMESPACE
|
|
|
|
|
|
|
|
#include "moc_qmessagebox.h"
|
|
|
|
#include "qrc_qmessagebox.cpp"
|
|
|
|
|
|
|
|
#endif // QT_NO_MESSAGEBOX
|