Mercurial > octave
comparison libgui/languages/build_ts/octave-qt/qmessagebox.cpp @ 31537:5ceb4bfcdb0f stable
add tools and files for updating the gui's language files for translation
* libgui/languages/build_ts/README.md: readme for updating language files
* libgui/languages/build_ts/octave-qsci: QScintilla source files for
languages without translation provided by QScintilla
* libgui/languages/build_ts/octave-qt: Qt source files for languages
without translation provided by Qt
author | Torsten Lilge <ttl-octave@mailbox.org> |
---|---|
date | Thu, 24 Nov 2022 06:48:25 +0100 |
parents | |
children | c8dd3da44e83 |
comparison
equal
deleted
inserted
replaced
31535:4b80982e0af8 | 31537:5ceb4bfcdb0f |
---|---|
1 /**************************************************************************** | |
2 ** | |
3 ** Copyright (C) 2015 The Qt Company Ltd. | |
4 ** Contact: http://www.qt.io/licensing/ | |
5 ** | |
6 ** This file is part of the QtGui module of the Qt Toolkit. | |
7 ** | |
8 ** $QT_BEGIN_LICENSE:LGPL$ | |
9 ** Commercial License Usage | |
10 ** Licensees holding valid commercial Qt licenses may use this file in | |
11 ** accordance with the commercial license agreement provided with the | |
12 ** Software or, alternatively, in accordance with the terms contained in | |
13 ** a written agreement between you and The Qt Company. For licensing terms | |
14 ** and conditions see http://www.qt.io/terms-conditions. For further | |
15 ** information use the contact form at http://www.qt.io/contact-us. | |
16 ** | |
17 ** GNU Lesser General Public License Usage | |
18 ** Alternatively, this file may be used under the terms of the GNU Lesser | |
19 ** General Public License version 2.1 or version 3 as published by the Free | |
20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and | |
21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the | |
22 ** following information to ensure the GNU Lesser General Public License | |
23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and | |
24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | |
25 ** | |
26 ** As a special exception, The Qt Company gives you certain additional | |
27 ** rights. These rights are described in The Qt Company LGPL Exception | |
28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | |
29 ** | |
30 ** GNU General Public License Usage | |
31 ** Alternatively, this file may be used under the terms of the GNU | |
32 ** General Public License version 3.0 as published by the Free Software | |
33 ** Foundation and appearing in the file LICENSE.GPL included in the | |
34 ** packaging of this file. Please review the following information to | |
35 ** ensure the GNU General Public License version 3.0 requirements will be | |
36 ** met: http://www.gnu.org/copyleft/gpl.html. | |
37 ** | |
38 ** $QT_END_LICENSE$ | |
39 ** | |
40 ****************************************************************************/ | |
41 | |
42 #include <QtGui/qmessagebox.h> | |
43 | |
44 #ifndef QT_NO_MESSAGEBOX | |
45 | |
46 #include <QtGui/qdialogbuttonbox.h> | |
47 #include "private/qlabel_p.h" | |
48 #include "private/qapplication_p.h" | |
49 #include <QtCore/qlist.h> | |
50 #include <QtCore/qdebug.h> | |
51 #include <QtGui/qstyle.h> | |
52 #include <QtGui/qstyleoption.h> | |
53 #include <QtGui/qgridlayout.h> | |
54 #include <QtGui/qdesktopwidget.h> | |
55 #include <QtGui/qpushbutton.h> | |
56 #include <QtGui/qaccessible.h> | |
57 #include <QtGui/qicon.h> | |
58 #include <QtGui/qtextdocument.h> | |
59 #include <QtGui/qapplication.h> | |
60 #include <QtGui/qtextedit.h> | |
61 #include <QtGui/qtextbrowser.h> | |
62 #include <QtGui/qmenu.h> | |
63 #include "qdialog_p.h" | |
64 #include <QtGui/qfont.h> | |
65 #include <QtGui/qfontmetrics.h> | |
66 #include <QtGui/qclipboard.h> | |
67 | |
68 #ifndef QT_NO_STYLE_S60 | |
69 #include <qs60style.h> | |
70 #endif | |
71 | |
72 #ifdef Q_WS_WINCE | |
73 extern bool qt_wince_is_mobile(); //defined in qguifunctions_wince.cpp | |
74 extern bool qt_wince_is_smartphone();//defined in qguifunctions_wince.cpp | |
75 extern bool qt_wince_is_pocket_pc(); //defined in qguifunctions_wince.cpp | |
76 | |
77 #include "qguifunctions_wince.h" | |
78 #endif | |
79 | |
80 QT_BEGIN_NAMESPACE | |
81 | |
82 enum Button { Old_Ok = 1, Old_Cancel = 2, Old_Yes = 3, Old_No = 4, Old_Abort = 5, Old_Retry = 6, | |
83 Old_Ignore = 7, Old_YesAll = 8, Old_NoAll = 9, Old_ButtonMask = 0xFF, | |
84 NewButtonMask = 0xFFFFFC00 }; | |
85 | |
86 enum DetailButtonLabel { ShowLabel = 0, HideLabel = 1 }; | |
87 #ifndef QT_NO_TEXTEDIT | |
88 class QMessageBoxDetailsText : public QWidget | |
89 { | |
90 public: | |
91 class TextEdit : public QTextEdit | |
92 { | |
93 public: | |
94 TextEdit(QWidget *parent=0) : QTextEdit(parent) { } | |
95 void contextMenuEvent(QContextMenuEvent * e) | |
96 { | |
97 #ifndef QT_NO_CONTEXTMENU | |
98 QMenu *menu = createStandardContextMenu(); | |
99 menu->setAttribute(Qt::WA_DeleteOnClose); | |
100 menu->popup(e->globalPos()); | |
101 #else | |
102 Q_UNUSED(e); | |
103 #endif | |
104 } | |
105 }; | |
106 | |
107 QMessageBoxDetailsText(QWidget *parent=0) | |
108 : QWidget(parent) | |
109 { | |
110 QVBoxLayout *layout = new QVBoxLayout; | |
111 layout->setMargin(0); | |
112 QFrame *line = new QFrame(this); | |
113 line->setFrameShape(QFrame::HLine); | |
114 line->setFrameShadow(QFrame::Sunken); | |
115 layout->addWidget(line); | |
116 textEdit = new TextEdit(); | |
117 textEdit->setFixedHeight(100); | |
118 textEdit->setFocusPolicy(Qt::NoFocus); | |
119 textEdit->setReadOnly(true); | |
120 layout->addWidget(textEdit); | |
121 setLayout(layout); | |
122 } | |
123 void setText(const QString &text) { textEdit->setPlainText(text); } | |
124 QString text() const { return textEdit->toPlainText(); } | |
125 private: | |
126 TextEdit *textEdit; | |
127 }; | |
128 #endif // QT_NO_TEXTEDIT | |
129 | |
130 class DetailButton : public QPushButton | |
131 { | |
132 public: | |
133 DetailButton(QWidget *parent) : QPushButton(label(ShowLabel), parent) | |
134 { | |
135 setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); | |
136 } | |
137 | |
138 QString label(DetailButtonLabel label) const | |
139 { return label == ShowLabel ? QMessageBox::tr("Show Details...") : QMessageBox::tr("Hide Details..."); } | |
140 | |
141 void setLabel(DetailButtonLabel lbl) | |
142 { setText(label(lbl)); } | |
143 | |
144 QSize sizeHint() const | |
145 { | |
146 ensurePolished(); | |
147 QStyleOptionButton opt; | |
148 initStyleOption(&opt); | |
149 const QFontMetrics fm = fontMetrics(); | |
150 opt.text = label(ShowLabel); | |
151 QSize sz = fm.size(Qt::TextShowMnemonic, opt.text); | |
152 QSize ret = style()->sizeFromContents(QStyle::CT_PushButton, &opt, sz, this). | |
153 expandedTo(QApplication::globalStrut()); | |
154 opt.text = label(HideLabel); | |
155 sz = fm.size(Qt::TextShowMnemonic, opt.text); | |
156 ret = ret.expandedTo(style()->sizeFromContents(QStyle::CT_PushButton, &opt, sz, this). | |
157 expandedTo(QApplication::globalStrut())); | |
158 return ret; | |
159 } | |
160 }; | |
161 | |
162 | |
163 class QMessageBoxPrivate : public QDialogPrivate | |
164 { | |
165 Q_DECLARE_PUBLIC(QMessageBox) | |
166 | |
167 public: | |
168 QMessageBoxPrivate() : escapeButton(0), defaultButton(0), clickedButton(0), detailsButton(0), | |
169 #ifndef QT_NO_TEXTEDIT | |
170 detailsText(0), | |
171 #endif | |
172 compatMode(false), autoAddOkButton(true), | |
173 detectedEscapeButton(0), informativeLabel(0) { } | |
174 | |
175 void init(const QString &title = QString(), const QString &text = QString()); | |
176 void _q_buttonClicked(QAbstractButton *); | |
177 | |
178 QAbstractButton *findButton(int button0, int button1, int button2, int flags); | |
179 void addOldButtons(int button0, int button1, int button2); | |
180 | |
181 QAbstractButton *abstractButtonForId(int id) const; | |
182 int execReturnCode(QAbstractButton *button); | |
183 | |
184 void detectEscapeButton(); | |
185 void updateSize(); | |
186 int layoutMinimumWidth(); | |
187 void retranslateStrings(); | |
188 | |
189 #ifdef Q_WS_WINCE | |
190 void hideSpecial(); | |
191 #endif | |
192 | |
193 static int showOldMessageBox(QWidget *parent, QMessageBox::Icon icon, | |
194 const QString &title, const QString &text, | |
195 int button0, int button1, int button2); | |
196 static int showOldMessageBox(QWidget *parent, QMessageBox::Icon icon, | |
197 const QString &title, const QString &text, | |
198 const QString &button0Text, | |
199 const QString &button1Text, | |
200 const QString &button2Text, | |
201 int defaultButtonNumber, | |
202 int escapeButtonNumber); | |
203 | |
204 static QMessageBox::StandardButton showNewMessageBox(QWidget *parent, | |
205 QMessageBox::Icon icon, const QString& title, const QString& text, | |
206 QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton); | |
207 | |
208 static QPixmap standardIcon(QMessageBox::Icon icon, QMessageBox *mb); | |
209 | |
210 QLabel *label; | |
211 QMessageBox::Icon icon; | |
212 QLabel *iconLabel; | |
213 QDialogButtonBox *buttonBox; | |
214 QList<QAbstractButton *> customButtonList; | |
215 QAbstractButton *escapeButton; | |
216 QPushButton *defaultButton; | |
217 QAbstractButton *clickedButton; | |
218 DetailButton *detailsButton; | |
219 #ifndef QT_NO_TEXTEDIT | |
220 QMessageBoxDetailsText *detailsText; | |
221 #endif | |
222 bool compatMode; | |
223 bool autoAddOkButton; | |
224 QAbstractButton *detectedEscapeButton; | |
225 QLabel *informativeLabel; | |
226 #if defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5) | |
227 QTextBrowser *textBrowser; | |
228 #endif | |
229 QPointer<QObject> receiverToDisconnectOnClose; | |
230 QByteArray memberToDisconnectOnClose; | |
231 QByteArray signalToDisconnectOnClose; | |
232 }; | |
233 | |
234 void QMessageBoxPrivate::init(const QString &title, const QString &text) | |
235 { | |
236 Q_Q(QMessageBox); | |
237 | |
238 label = new QLabel; | |
239 label->setObjectName(QLatin1String("qt_msgbox_label")); | |
240 label->setTextInteractionFlags(Qt::TextInteractionFlags(q->style()->styleHint(QStyle::SH_MessageBox_TextInteractionFlags, 0, q))); | |
241 label->setAlignment(Qt::AlignVCenter | Qt::AlignLeft); | |
242 label->setOpenExternalLinks(true); | |
243 #if defined(Q_WS_MAC) | |
244 label->setContentsMargins(16, 0, 0, 0); | |
245 #elif !defined(Q_WS_QWS) | |
246 label->setContentsMargins(2, 0, 0, 0); | |
247 label->setIndent(9); | |
248 #endif | |
249 icon = QMessageBox::NoIcon; | |
250 iconLabel = new QLabel; | |
251 iconLabel->setObjectName(QLatin1String("qt_msgboxex_icon_label")); | |
252 iconLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); | |
253 | |
254 buttonBox = new QDialogButtonBox; | |
255 buttonBox->setObjectName(QLatin1String("qt_msgbox_buttonbox")); | |
256 buttonBox->setCenterButtons(q->style()->styleHint(QStyle::SH_MessageBox_CenterButtons, 0, q)); | |
257 QObject::connect(buttonBox, SIGNAL(clicked(QAbstractButton*)), | |
258 q, SLOT(_q_buttonClicked(QAbstractButton*))); | |
259 | |
260 QGridLayout *grid = new QGridLayout; | |
261 #ifndef Q_WS_MAC | |
262 #ifdef Q_WS_S60 | |
263 const int preferredIconColumn = (QApplication::layoutDirection() == Qt::LeftToRight) ? 1 : 0; | |
264 const int preferredTextColumn = (QApplication::layoutDirection() == Qt::LeftToRight) ? 0 : 1; | |
265 #else | |
266 const int preferredIconColumn = 0; | |
267 const int preferredTextColumn = 1; | |
268 #endif | |
269 grid->addWidget(iconLabel, 0, preferredIconColumn, 2, 1, Qt::AlignTop); | |
270 grid->addWidget(label, 0, preferredTextColumn, 1, 1); | |
271 // -- leave space for information label -- | |
272 grid->addWidget(buttonBox, 2, 0, 1, 2); | |
273 #else | |
274 grid->setMargin(0); | |
275 grid->setVerticalSpacing(8); | |
276 grid->setHorizontalSpacing(0); | |
277 q->setContentsMargins(24, 15, 24, 20); | |
278 grid->addWidget(iconLabel, 0, 0, 2, 1, Qt::AlignTop | Qt::AlignLeft); | |
279 grid->addWidget(label, 0, 1, 1, 1); | |
280 // -- leave space for information label -- | |
281 grid->setRowStretch(1, 100); | |
282 grid->setRowMinimumHeight(2, 6); | |
283 grid->addWidget(buttonBox, 3, 1, 1, 1); | |
284 #endif | |
285 | |
286 grid->setSizeConstraint(QLayout::SetNoConstraint); | |
287 q->setLayout(grid); | |
288 | |
289 if (!title.isEmpty() || !text.isEmpty()) { | |
290 q->setWindowTitle(title); | |
291 q->setText(text); | |
292 } | |
293 q->setModal(true); | |
294 | |
295 #ifdef Q_WS_MAC | |
296 QFont f = q->font(); | |
297 f.setBold(true); | |
298 label->setFont(f); | |
299 #endif | |
300 retranslateStrings(); | |
301 } | |
302 | |
303 int QMessageBoxPrivate::layoutMinimumWidth() | |
304 { | |
305 layout->activate(); | |
306 return layout->totalMinimumSize().width(); | |
307 } | |
308 | |
309 void QMessageBoxPrivate::updateSize() | |
310 { | |
311 Q_Q(QMessageBox); | |
312 | |
313 if (!q->isVisible()) | |
314 return; | |
315 | |
316 QSize screenSize = QApplication::desktop()->availableGeometry(QCursor::pos()).size(); | |
317 #if defined(Q_WS_QWS) || defined(Q_WS_WINCE) || defined(Q_OS_SYMBIAN) | |
318 // the width of the screen, less the window border. | |
319 int hardLimit = screenSize.width() - (q->frameGeometry().width() - q->geometry().width()); | |
320 #else | |
321 int hardLimit = qMin(screenSize.width() - 480, 1000); // can never get bigger than this | |
322 // on small screens allows the messagebox be the same size as the screen | |
323 if (screenSize.width() <= 1024) | |
324 hardLimit = screenSize.width(); | |
325 #endif | |
326 #ifdef Q_WS_MAC | |
327 int softLimit = qMin(screenSize.width()/2, 420); | |
328 #elif defined(Q_WS_QWS) | |
329 int softLimit = qMin(hardLimit, 500); | |
330 #else | |
331 // note: ideally on windows, hard and soft limits but it breaks compat | |
332 #ifndef Q_WS_WINCE | |
333 int softLimit = qMin(screenSize.width()/2, 500); | |
334 #else | |
335 int softLimit = qMin(screenSize.width() * 3 / 4, 500); | |
336 #endif //Q_WS_WINCE | |
337 #endif | |
338 | |
339 if (informativeLabel) | |
340 informativeLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); | |
341 | |
342 label->setWordWrap(false); // makes the label return min size | |
343 int width = layoutMinimumWidth(); | |
344 | |
345 if (width > softLimit) { | |
346 label->setWordWrap(true); | |
347 width = qMax(softLimit, layoutMinimumWidth()); | |
348 | |
349 if (width > hardLimit) { | |
350 label->d_func()->ensureTextControl(); | |
351 if (QTextControl *control = label->d_func()->control) { | |
352 QTextOption opt = control->document()->defaultTextOption(); | |
353 opt.setWrapMode(QTextOption::WrapAnywhere); | |
354 control->document()->setDefaultTextOption(opt); | |
355 } | |
356 width = hardLimit; | |
357 } | |
358 } | |
359 #ifdef Q_WS_S60 | |
360 // in S60 portait messageBoxes should always occupy maximum width | |
361 if (QApplication::desktop()->size().height() > QApplication::desktop()->size().width()){ | |
362 width = hardLimit; | |
363 } else { | |
364 // in landscape the messageBoxes should be of same width as in portrait | |
365 width = qMin(QApplication::desktop()->size().height(), hardLimit); | |
366 } | |
367 #endif | |
368 | |
369 if (informativeLabel) { | |
370 label->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); | |
371 QSizePolicy policy(QSizePolicy::Minimum, QSizePolicy::Preferred); | |
372 policy.setHeightForWidth(true); | |
373 informativeLabel->setSizePolicy(policy); | |
374 width = qMax(width, layoutMinimumWidth()); | |
375 if (width > hardLimit) { // longest word is really big, so wrap anywhere | |
376 informativeLabel->d_func()->ensureTextControl(); | |
377 if (QTextControl *control = informativeLabel->d_func()->control) { | |
378 QTextOption opt = control->document()->defaultTextOption(); | |
379 opt.setWrapMode(QTextOption::WrapAnywhere); | |
380 control->document()->setDefaultTextOption(opt); | |
381 } | |
382 width = hardLimit; | |
383 } | |
384 policy.setHeightForWidth(label->wordWrap()); | |
385 label->setSizePolicy(policy); | |
386 } | |
387 | |
388 QFontMetrics fm(QApplication::font("QWorkspaceTitleBar")); | |
389 int windowTitleWidth = qMin(fm.width(q->windowTitle()) + 50, hardLimit); | |
390 if (windowTitleWidth > width) | |
391 width = windowTitleWidth; | |
392 | |
393 layout->activate(); | |
394 int height = (layout->hasHeightForWidth()) | |
395 ? layout->totalHeightForWidth(width) | |
396 : layout->totalMinimumSize().height(); | |
397 | |
398 #ifndef QT_NO_STYLE_S60 | |
399 QS60Style *s60Style = 0; | |
400 s60Style = qobject_cast<QS60Style *>(QApplication::style()); | |
401 | |
402 //use custom pixel metric to deduce the minimum height of the messagebox | |
403 if (s60Style) | |
404 height = qMax(height, s60Style->pixelMetric((QStyle::PixelMetric)PM_MessageBoxHeight)); | |
405 #endif | |
406 | |
407 q->setFixedSize(width, height); | |
408 QCoreApplication::removePostedEvents(q, QEvent::LayoutRequest); | |
409 } | |
410 | |
411 | |
412 #ifdef Q_WS_WINCE | |
413 /*! | |
414 \internal | |
415 Hides special buttons which are rather shown in the title bar | |
416 on WinCE, to conserve screen space. | |
417 */ | |
418 | |
419 void QMessageBoxPrivate::hideSpecial() | |
420 { | |
421 Q_Q(QMessageBox); | |
422 QList<QPushButton*> list = q->findChildren<QPushButton*>(); | |
423 for (int i=0; i<list.size(); ++i) { | |
424 QPushButton *pb = list.at(i); | |
425 QString text = pb->text(); | |
426 text.remove(QChar::fromLatin1('&')); | |
427 if (text == QApplication::translate("QMessageBox", "OK" )) | |
428 pb->setFixedSize(0,0); | |
429 } | |
430 } | |
431 #endif | |
432 | |
433 static int oldButton(int button) | |
434 { | |
435 switch (button & QMessageBox::ButtonMask) { | |
436 case QMessageBox::Ok: | |
437 return Old_Ok; | |
438 case QMessageBox::Cancel: | |
439 return Old_Cancel; | |
440 case QMessageBox::Yes: | |
441 return Old_Yes; | |
442 case QMessageBox::No: | |
443 return Old_No; | |
444 case QMessageBox::Abort: | |
445 return Old_Abort; | |
446 case QMessageBox::Retry: | |
447 return Old_Retry; | |
448 case QMessageBox::Ignore: | |
449 return Old_Ignore; | |
450 case QMessageBox::YesToAll: | |
451 return Old_YesAll; | |
452 case QMessageBox::NoToAll: | |
453 return Old_NoAll; | |
454 default: | |
455 return 0; | |
456 } | |
457 } | |
458 | |
459 int QMessageBoxPrivate::execReturnCode(QAbstractButton *button) | |
460 { | |
461 int ret = buttonBox->standardButton(button); | |
462 if (ret == QMessageBox::NoButton) { | |
463 ret = customButtonList.indexOf(button); // if button == 0, correctly sets ret = -1 | |
464 } else if (compatMode) { | |
465 ret = oldButton(ret); | |
466 } | |
467 return ret; | |
468 } | |
469 | |
470 void QMessageBoxPrivate::_q_buttonClicked(QAbstractButton *button) | |
471 { | |
472 Q_Q(QMessageBox); | |
473 #ifndef QT_NO_TEXTEDIT | |
474 if (detailsButton && detailsText && button == detailsButton) { | |
475 detailsButton->setLabel(detailsText->isHidden() ? HideLabel : ShowLabel); | |
476 detailsText->setHidden(!detailsText->isHidden()); | |
477 updateSize(); | |
478 } else | |
479 #endif | |
480 { | |
481 clickedButton = button; | |
482 q->done(execReturnCode(button)); // does not trigger closeEvent | |
483 emit q->buttonClicked(button); | |
484 | |
485 if (receiverToDisconnectOnClose) { | |
486 QObject::disconnect(q, signalToDisconnectOnClose, receiverToDisconnectOnClose, | |
487 memberToDisconnectOnClose); | |
488 receiverToDisconnectOnClose = 0; | |
489 } | |
490 signalToDisconnectOnClose.clear(); | |
491 memberToDisconnectOnClose.clear(); | |
492 } | |
493 } | |
494 | |
495 /*! | |
496 \class QMessageBox | |
497 | |
498 \brief The QMessageBox class provides a modal dialog for informing | |
499 the user or for asking the user a question and receiving an answer. | |
500 | |
501 \ingroup standard-dialogs | |
502 | |
503 | |
504 A message box displays a primary \l{QMessageBox::text}{text} to | |
505 alert the user to a situation, an \l{QMessageBox::informativeText} | |
506 {informative text} to further explain the alert or to ask the user | |
507 a question, and an optional \l{QMessageBox::detailedText} | |
508 {detailed text} to provide even more data if the user requests | |
509 it. A message box can also display an \l{QMessageBox::icon} {icon} | |
510 and \l{QMessageBox::standardButtons} {standard buttons} for | |
511 accepting a user response. | |
512 | |
513 Two APIs for using QMessageBox are provided, the property-based | |
514 API, and the static functions. Calling one of the static functions | |
515 is the simpler approach, but it is less flexible than using the | |
516 property-based API, and the result is less informative. Using the | |
517 property-based API is recommended. | |
518 | |
519 \section1 The Property-based API | |
520 | |
521 To use the property-based API, construct an instance of | |
522 QMessageBox, set the desired properties, and call exec() to show | |
523 the message. The simplest configuration is to set only the | |
524 \l{QMessageBox::text} {message text} property. | |
525 | |
526 \snippet doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp 5 | |
527 | |
528 The user must click the \gui{OK} button to dismiss the message | |
529 box. The rest of the GUI is blocked until the message box is | |
530 dismissed. | |
531 | |
532 \image msgbox1.png | |
533 | |
534 A better approach than just alerting the user to an event is to | |
535 also ask the user what to do about it. Store the question in the | |
536 \l{QMessageBox::informativeText} {informative text} property, and | |
537 set the \l{QMessageBox::standardButtons} {standard buttons} | |
538 property to the set of buttons you want as the set of user | |
539 responses. The buttons are specified by combining values from | |
540 StandardButtons using the bitwise OR operator. The display order | |
541 for the buttons is platform-dependent. For example, on Windows, | |
542 \gui{Save} is displayed to the left of \gui{Cancel}, whereas on | |
543 Mac OS, the order is reversed. | |
544 | |
545 Mark one of your standard buttons to be your | |
546 \l{QMessageBox::defaultButton()} {default button}. | |
547 | |
548 \snippet doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp 6 | |
549 | |
550 This is the approach recommended in the | |
551 \l{http://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/AppleHIGuidelines/Windows/Windows.html#//apple_ref/doc/uid/20000961-BABCAJID} | |
552 {Mac OS X Guidelines}. Similar guidelines apply for the other | |
553 platforms, but note the different ways the | |
554 \l{QMessageBox::informativeText} {informative text} is handled for | |
555 different platforms. | |
556 | |
557 \image msgbox2.png | |
558 | |
559 The exec() slot returns the StandardButtons value of the button | |
560 that was clicked. | |
561 | |
562 \snippet doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp 7 | |
563 | |
564 To give the user more information to help him answer the question, | |
565 set the \l{QMessageBox::detailedText} {detailed text} property. If | |
566 the \l{QMessageBox::detailedText} {detailed text} property is set, | |
567 the \gui{Show Details...} button will be shown. | |
568 | |
569 \image msgbox3.png | |
570 | |
571 Clicking the \gui{Show Details...} button displays the detailed text. | |
572 | |
573 \image msgbox4.png | |
574 | |
575 \section2 Rich Text and the Text Format Property | |
576 | |
577 The \l{QMessageBox::detailedText} {detailed text} property is | |
578 always interpreted as plain text. The \l{QMessageBox::text} {main | |
579 text} and \l{QMessageBox::informativeText} {informative text} | |
580 properties can be either plain text or rich text. These strings | |
581 are interpreted according to the setting of the | |
582 \l{QMessageBox::textFormat} {text format} property. The default | |
583 setting is \l{Qt::AutoText} {auto-text}. | |
584 | |
585 Note that for some plain text strings containing XML | |
586 meta-characters, the auto-text \l{Qt::mightBeRichText()} {rich | |
587 text detection test} may fail causing your plain text string to be | |
588 interpreted incorrectly as rich text. In these rare cases, use | |
589 Qt::convertFromPlainText() to convert your plain text string to a | |
590 visually equivalent rich text string, or set the | |
591 \l{QMessageBox::textFormat} {text format} property explicitly with | |
592 setTextFormat(). | |
593 | |
594 \section2 Severity Levels and the Icon and Pixmap Properties | |
595 | |
596 QMessageBox supports four predefined message severity levels, or message | |
597 types, which really only differ in the predefined icon they each show. | |
598 Specify one of the four predefined message types by setting the | |
599 \l{QMessageBox::icon}{icon} property to one of the | |
600 \l{QMessageBox::Icon}{predefined icons}. The following rules are | |
601 guidelines: | |
602 | |
603 \table | |
604 \row | |
605 \o \img qmessagebox-quest.png | |
606 \o \l Question | |
607 \o For asking a question during normal operations. | |
608 \row | |
609 \o \img qmessagebox-info.png | |
610 \o \l Information | |
611 \o For reporting information about normal operations. | |
612 \row | |
613 \o \img qmessagebox-warn.png | |
614 \o \l Warning | |
615 \o For reporting non-critical errors. | |
616 \row | |
617 \o \img qmessagebox-crit.png | |
618 \o \l Critical | |
619 \o For reporting critical errors. | |
620 \endtable | |
621 | |
622 \l{QMessageBox::Icon}{Predefined icons} are not defined by QMessageBox, but | |
623 provided by the style. The default value is \l{QMessageBox::NoIcon} | |
624 {No Icon}. The message boxes are otherwise the same for all cases. When | |
625 using a standard icon, use the one recommended in the table, or use the | |
626 one recommended by the style guidelines for your platform. If none of the | |
627 standard icons is right for your message box, you can use a custom icon by | |
628 setting the \l{QMessageBox::iconPixmap}{icon pixmap} property instead of | |
629 setting the \l{QMessageBox::icon}{icon} property. | |
630 | |
631 In summary, to set an icon, use \e{either} setIcon() for one of the | |
632 standard icons, \e{or} setIconPixmap() for a custom icon. | |
633 | |
634 \section1 The Static Functions API | |
635 | |
636 Building message boxes with the static functions API, although | |
637 convenient, is less flexible than using the property-based API, | |
638 because the static function signatures lack parameters for setting | |
639 the \l{QMessageBox::informativeText} {informative text} and | |
640 \l{QMessageBox::detailedText} {detailed text} properties. One | |
641 work-around for this has been to use the \c{title} parameter as | |
642 the message box main text and the \c{text} parameter as the | |
643 message box informative text. Because this has the obvious | |
644 drawback of making a less readable message box, platform | |
645 guidelines do not recommend it. The \e{Microsoft Windows User | |
646 Interface Guidelines} recommend using the | |
647 \l{QCoreApplication::applicationName} {application name} as the | |
648 \l{QMessageBox::setWindowTitle()} {window's title}, which means | |
649 that if you have an informative text in addition to your main | |
650 text, you must concatenate it to the \c{text} parameter. | |
651 | |
652 Note that the static function signatures have changed with respect | |
653 to their button parameters, which are now used to set the | |
654 \l{QMessageBox::standardButtons} {standard buttons} and the | |
655 \l{QMessageBox::defaultButton()} {default button}. | |
656 | |
657 Static functions are available for creating information(), | |
658 question(), warning(), and critical() message boxes. | |
659 | |
660 \snippet doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp 0 | |
661 | |
662 The \l{dialogs/standarddialogs}{Standard Dialogs} example shows | |
663 how to use QMessageBox and the other built-in Qt dialogs. | |
664 | |
665 \section1 Advanced Usage | |
666 | |
667 If the \l{QMessageBox::StandardButtons} {standard buttons} are not | |
668 flexible enough for your message box, you can use the addButton() | |
669 overload that takes a text and a ButtonRoleto to add custom | |
670 buttons. The ButtonRole is used by QMessageBox to determine the | |
671 ordering of the buttons on screen (which varies according to the | |
672 platform). You can test the value of clickedButton() after calling | |
673 exec(). For example, | |
674 | |
675 \snippet doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp 2 | |
676 | |
677 \section1 Default and Escape Keys | |
678 | |
679 The default button (i.e., the button activated when \key Enter is | |
680 pressed) can be specified using setDefaultButton(). If a default | |
681 button is not specified, QMessageBox tries to find one based on | |
682 the \l{ButtonRole} {button roles} of the buttons used in the | |
683 message box. | |
684 | |
685 The escape button (the button activated when \key Esc is pressed) | |
686 can be specified using setEscapeButton(). If an escape button is | |
687 not specified, QMessageBox tries to find one using these rules: | |
688 | |
689 \list 1 | |
690 | |
691 \o If there is only one button, it is the button activated when | |
692 \key Esc is pressed. | |
693 | |
694 \o If there is a \l Cancel button, it is the button activated when | |
695 \key Esc is pressed. | |
696 | |
697 \o If there is exactly one button having either | |
698 \l{QMessageBox::RejectRole} {the Reject role} or the | |
699 \l{QMessageBox::NoRole} {the No role}, it is the button | |
700 activated when \key Esc is pressed. | |
701 | |
702 \endlist | |
703 | |
704 When an escape button can't be determined using these rules, | |
705 pressing \key Esc has no effect. | |
706 | |
707 \sa QDialogButtonBox, {fowler}{GUI Design Handbook: Message Box}, {Standard Dialogs Example}, {Application Example} | |
708 */ | |
709 | |
710 /*! | |
711 \enum QMessageBox::StandardButton | |
712 \since 4.2 | |
713 | |
714 These enums describe flags for standard buttons. Each button has a | |
715 defined \l ButtonRole. | |
716 | |
717 \value Ok An "OK" button defined with the \l AcceptRole. | |
718 \value Open A "Open" button defined with the \l AcceptRole. | |
719 \value Save A "Save" button defined with the \l AcceptRole. | |
720 \value Cancel A "Cancel" button defined with the \l RejectRole. | |
721 \value Close A "Close" button defined with the \l RejectRole. | |
722 \value Discard A "Discard" or "Don't Save" button, depending on the platform, | |
723 defined with the \l DestructiveRole. | |
724 \value Apply An "Apply" button defined with the \l ApplyRole. | |
725 \value Reset A "Reset" button defined with the \l ResetRole. | |
726 \value RestoreDefaults A "Restore Defaults" button defined with the \l ResetRole. | |
727 \value Help A "Help" button defined with the \l HelpRole. | |
728 \value SaveAll A "Save All" button defined with the \l AcceptRole. | |
729 \value Yes A "Yes" button defined with the \l YesRole. | |
730 \value YesToAll A "Yes to All" button defined with the \l YesRole. | |
731 \value No A "No" button defined with the \l NoRole. | |
732 \value NoToAll A "No to All" button defined with the \l NoRole. | |
733 \value Abort An "Abort" button defined with the \l RejectRole. | |
734 \value Retry A "Retry" button defined with the \l AcceptRole. | |
735 \value Ignore An "Ignore" button defined with the \l AcceptRole. | |
736 | |
737 \value NoButton An invalid button. | |
738 | |
739 \omitvalue FirstButton | |
740 \omitvalue LastButton | |
741 | |
742 The following values are obsolete: | |
743 | |
744 \value YesAll Use YesToAll instead. | |
745 \value NoAll Use NoToAll instead. | |
746 \value Default Use the \c defaultButton argument of | |
747 information(), warning(), etc. instead, or call | |
748 setDefaultButton(). | |
749 \value Escape Call setEscapeButton() instead. | |
750 \value FlagMask | |
751 \value ButtonMask | |
752 | |
753 \sa ButtonRole, standardButtons | |
754 */ | |
755 | |
756 /*! | |
757 \fn void QMessageBox::buttonClicked(QAbstractButton *button) | |
758 | |
759 This signal is emitted whenever a button is clicked inside the QMessageBox. | |
760 The button that was clicked in returned in \a button. | |
761 */ | |
762 | |
763 /*! | |
764 Constructs a message box with no text and no buttons. \a parent is | |
765 passed to the QDialog constructor. | |
766 | |
767 On Mac OS X, if you want your message box to appear | |
768 as a Qt::Sheet of its \a parent, set the message box's | |
769 \l{setWindowModality()} {window modality} to Qt::WindowModal or use open(). | |
770 Otherwise, the message box will be a standard dialog. | |
771 | |
772 */ | |
773 QMessageBox::QMessageBox(QWidget *parent) | |
774 : QDialog(*new QMessageBoxPrivate, parent, Qt::MSWindowsFixedSizeDialogHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint) | |
775 { | |
776 Q_D(QMessageBox); | |
777 d->init(); | |
778 } | |
779 | |
780 /*! | |
781 Constructs a message box with the given \a icon, \a title, \a | |
782 text, and standard \a buttons. Standard or custom buttons can be | |
783 added at any time using addButton(). The \a parent and \a f | |
784 arguments are passed to the QDialog constructor. | |
785 | |
786 The message box is an \l{Qt::ApplicationModal} {application modal} | |
787 dialog box. | |
788 | |
789 On Mac OS X, if \a parent is not 0 and you want your message box | |
790 to appear as a Qt::Sheet of that parent, set the message box's | |
791 \l{setWindowModality()} {window modality} to Qt::WindowModal | |
792 (default). Otherwise, the message box will be a standard dialog. | |
793 | |
794 \sa setWindowTitle(), setText(), setIcon(), setStandardButtons() | |
795 */ | |
796 QMessageBox::QMessageBox(Icon icon, const QString &title, const QString &text, | |
797 StandardButtons buttons, QWidget *parent, | |
798 Qt::WindowFlags f) | |
799 : QDialog(*new QMessageBoxPrivate, parent, f | Qt::MSWindowsFixedSizeDialogHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint) | |
800 { | |
801 Q_D(QMessageBox); | |
802 d->init(title, text); | |
803 setIcon(icon); | |
804 if (buttons != NoButton) | |
805 setStandardButtons(buttons); | |
806 } | |
807 | |
808 /*! | |
809 Destroys the message box. | |
810 */ | |
811 QMessageBox::~QMessageBox() | |
812 { | |
813 } | |
814 | |
815 /*! | |
816 \since 4.2 | |
817 | |
818 Adds the given \a button to the message box with the specified \a | |
819 role. | |
820 | |
821 \sa removeButton(), button(), setStandardButtons() | |
822 */ | |
823 void QMessageBox::addButton(QAbstractButton *button, ButtonRole role) | |
824 { | |
825 Q_D(QMessageBox); | |
826 if (!button) | |
827 return; | |
828 removeButton(button); | |
829 d->buttonBox->addButton(button, (QDialogButtonBox::ButtonRole)role); | |
830 d->customButtonList.append(button); | |
831 d->autoAddOkButton = false; | |
832 } | |
833 | |
834 /*! | |
835 \since 4.2 | |
836 \overload | |
837 | |
838 Creates a button with the given \a text, adds it to the message box for the | |
839 specified \a role, and returns it. | |
840 */ | |
841 QPushButton *QMessageBox::addButton(const QString& text, ButtonRole role) | |
842 { | |
843 Q_D(QMessageBox); | |
844 QPushButton *pushButton = new QPushButton(text); | |
845 addButton(pushButton, role); | |
846 d->updateSize(); | |
847 return pushButton; | |
848 } | |
849 | |
850 /*! | |
851 \since 4.2 | |
852 \overload | |
853 | |
854 Adds a standard \a button to the message box if it is valid to do so, and | |
855 returns the push button. | |
856 | |
857 \sa setStandardButtons() | |
858 */ | |
859 QPushButton *QMessageBox::addButton(StandardButton button) | |
860 { | |
861 Q_D(QMessageBox); | |
862 QPushButton *pushButton = d->buttonBox->addButton((QDialogButtonBox::StandardButton)button); | |
863 if (pushButton) | |
864 d->autoAddOkButton = false; | |
865 return pushButton; | |
866 } | |
867 | |
868 /*! | |
869 \since 4.2 | |
870 | |
871 Removes \a button from the button box without deleting it. | |
872 | |
873 \sa addButton(), setStandardButtons() | |
874 */ | |
875 void QMessageBox::removeButton(QAbstractButton *button) | |
876 { | |
877 Q_D(QMessageBox); | |
878 d->customButtonList.removeAll(button); | |
879 if (d->escapeButton == button) | |
880 d->escapeButton = 0; | |
881 if (d->defaultButton == button) | |
882 d->defaultButton = 0; | |
883 d->buttonBox->removeButton(button); | |
884 d->updateSize(); | |
885 } | |
886 | |
887 /*! | |
888 \property QMessageBox::standardButtons | |
889 \brief collection of standard buttons in the message box | |
890 \since 4.2 | |
891 | |
892 This property controls which standard buttons are used by the message box. | |
893 | |
894 By default, this property contains no standard buttons. | |
895 | |
896 \sa addButton() | |
897 */ | |
898 void QMessageBox::setStandardButtons(StandardButtons buttons) | |
899 { | |
900 Q_D(QMessageBox); | |
901 d->buttonBox->setStandardButtons(QDialogButtonBox::StandardButtons(int(buttons))); | |
902 | |
903 QList<QAbstractButton *> buttonList = d->buttonBox->buttons(); | |
904 if (!buttonList.contains(d->escapeButton)) | |
905 d->escapeButton = 0; | |
906 if (!buttonList.contains(d->defaultButton)) | |
907 d->defaultButton = 0; | |
908 d->autoAddOkButton = false; | |
909 d->updateSize(); | |
910 } | |
911 | |
912 QMessageBox::StandardButtons QMessageBox::standardButtons() const | |
913 { | |
914 Q_D(const QMessageBox); | |
915 return QMessageBox::StandardButtons(int(d->buttonBox->standardButtons())); | |
916 } | |
917 | |
918 /*! | |
919 \since 4.2 | |
920 | |
921 Returns the standard button enum value corresponding to the given \a button, | |
922 or NoButton if the given \a button isn't a standard button. | |
923 | |
924 \sa button(), standardButtons() | |
925 */ | |
926 QMessageBox::StandardButton QMessageBox::standardButton(QAbstractButton *button) const | |
927 { | |
928 Q_D(const QMessageBox); | |
929 return (QMessageBox::StandardButton)d->buttonBox->standardButton(button); | |
930 } | |
931 | |
932 /*! | |
933 \since 4.2 | |
934 | |
935 Returns a pointer corresponding to the standard button \a which, | |
936 or 0 if the standard button doesn't exist in this message box. | |
937 | |
938 \sa standardButtons, standardButton() | |
939 */ | |
940 QAbstractButton *QMessageBox::button(StandardButton which) const | |
941 { | |
942 Q_D(const QMessageBox); | |
943 return d->buttonBox->button(QDialogButtonBox::StandardButton(which)); | |
944 } | |
945 | |
946 /*! | |
947 \since 4.2 | |
948 | |
949 Returns the button that is activated when escape is pressed. | |
950 | |
951 By default, QMessageBox attempts to automatically detect an | |
952 escape button as follows: | |
953 | |
954 \list 1 | |
955 \o If there is only one button, it is made the escape button. | |
956 \o If there is a \l Cancel button, it is made the escape button. | |
957 \o On Mac OS X only, if there is exactly one button with the role | |
958 QMessageBox::RejectRole, it is made the escape button. | |
959 \endlist | |
960 | |
961 When an escape button could not be automatically detected, pressing | |
962 \key Esc has no effect. | |
963 | |
964 \sa addButton() | |
965 */ | |
966 QAbstractButton *QMessageBox::escapeButton() const | |
967 { | |
968 Q_D(const QMessageBox); | |
969 return d->escapeButton; | |
970 } | |
971 | |
972 /*! | |
973 \since 4.2 | |
974 | |
975 Sets the button that gets activated when the \key Escape key is | |
976 pressed to \a button. | |
977 | |
978 \sa addButton(), clickedButton() | |
979 */ | |
980 void QMessageBox::setEscapeButton(QAbstractButton *button) | |
981 { | |
982 Q_D(QMessageBox); | |
983 if (d->buttonBox->buttons().contains(button)) | |
984 d->escapeButton = button; | |
985 } | |
986 | |
987 /*! | |
988 \since 4.3 | |
989 | |
990 Sets the buttons that gets activated when the \key Escape key is | |
991 pressed to \a button. | |
992 | |
993 \sa addButton(), clickedButton() | |
994 */ | |
995 void QMessageBox::setEscapeButton(QMessageBox::StandardButton button) | |
996 { | |
997 Q_D(QMessageBox); | |
998 setEscapeButton(d->buttonBox->button(QDialogButtonBox::StandardButton(button))); | |
999 } | |
1000 | |
1001 void QMessageBoxPrivate::detectEscapeButton() | |
1002 { | |
1003 if (escapeButton) { // escape button explicitly set | |
1004 detectedEscapeButton = escapeButton; | |
1005 return; | |
1006 } | |
1007 | |
1008 // Cancel button automatically becomes escape button | |
1009 detectedEscapeButton = buttonBox->button(QDialogButtonBox::Cancel); | |
1010 if (detectedEscapeButton) | |
1011 return; | |
1012 | |
1013 // If there is only one button, make it the escape button | |
1014 const QList<QAbstractButton *> buttons = buttonBox->buttons(); | |
1015 if (buttons.count() == 1) { | |
1016 detectedEscapeButton = buttons.first(); | |
1017 return; | |
1018 } | |
1019 | |
1020 // if the message box has one RejectRole button, make it the escape button | |
1021 for (int i = 0; i < buttons.count(); i++) { | |
1022 if (buttonBox->buttonRole(buttons.at(i)) == QDialogButtonBox::RejectRole) { | |
1023 if (detectedEscapeButton) { // already detected! | |
1024 detectedEscapeButton = 0; | |
1025 break; | |
1026 } | |
1027 detectedEscapeButton = buttons.at(i); | |
1028 } | |
1029 } | |
1030 if (detectedEscapeButton) | |
1031 return; | |
1032 | |
1033 // if the message box has one NoRole button, make it the escape button | |
1034 for (int i = 0; i < buttons.count(); i++) { | |
1035 if (buttonBox->buttonRole(buttons.at(i)) == QDialogButtonBox::NoRole) { | |
1036 if (detectedEscapeButton) { // already detected! | |
1037 detectedEscapeButton = 0; | |
1038 break; | |
1039 } | |
1040 detectedEscapeButton = buttons.at(i); | |
1041 } | |
1042 } | |
1043 } | |
1044 | |
1045 /*! | |
1046 \since 4.2 | |
1047 | |
1048 Returns the button that was clicked by the user, | |
1049 or 0 if the user hit the \key Esc key and | |
1050 no \l{setEscapeButton()}{escape button} was set. | |
1051 | |
1052 If exec() hasn't been called yet, returns 0. | |
1053 | |
1054 Example: | |
1055 | |
1056 \snippet doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp 3 | |
1057 | |
1058 \sa standardButton(), button() | |
1059 */ | |
1060 QAbstractButton *QMessageBox::clickedButton() const | |
1061 { | |
1062 Q_D(const QMessageBox); | |
1063 return d->clickedButton; | |
1064 } | |
1065 | |
1066 /*! | |
1067 \since 4.2 | |
1068 | |
1069 Returns the button that should be the message box's | |
1070 \l{QPushButton::setDefault()}{default button}. Returns 0 | |
1071 if no default button was set. | |
1072 | |
1073 \sa addButton(), QPushButton::setDefault() | |
1074 */ | |
1075 QPushButton *QMessageBox::defaultButton() const | |
1076 { | |
1077 Q_D(const QMessageBox); | |
1078 return d->defaultButton; | |
1079 } | |
1080 | |
1081 /*! | |
1082 \since 4.2 | |
1083 | |
1084 Sets the message box's \l{QPushButton::setDefault()}{default button} | |
1085 to \a button. | |
1086 | |
1087 \sa addButton(), QPushButton::setDefault() | |
1088 */ | |
1089 void QMessageBox::setDefaultButton(QPushButton *button) | |
1090 { | |
1091 Q_D(QMessageBox); | |
1092 if (!d->buttonBox->buttons().contains(button)) | |
1093 return; | |
1094 d->defaultButton = button; | |
1095 button->setDefault(true); | |
1096 button->setFocus(); | |
1097 } | |
1098 | |
1099 /*! | |
1100 \since 4.3 | |
1101 | |
1102 Sets the message box's \l{QPushButton::setDefault()}{default button} | |
1103 to \a button. | |
1104 | |
1105 \sa addButton(), QPushButton::setDefault() | |
1106 */ | |
1107 void QMessageBox::setDefaultButton(QMessageBox::StandardButton button) | |
1108 { | |
1109 Q_D(QMessageBox); | |
1110 setDefaultButton(d->buttonBox->button(QDialogButtonBox::StandardButton(button))); | |
1111 } | |
1112 | |
1113 /*! | |
1114 \property QMessageBox::text | |
1115 \brief the message box text to be displayed. | |
1116 | |
1117 The text will be interpreted either as a plain text or as rich text, | |
1118 depending on the text format setting (\l QMessageBox::textFormat). | |
1119 The default setting is Qt::AutoText, i.e., the message box will try | |
1120 to auto-detect the format of the text. | |
1121 | |
1122 The default value of this property is an empty string. | |
1123 | |
1124 \sa textFormat, QMessageBox::informativeText, QMessageBox::detailedText | |
1125 */ | |
1126 QString QMessageBox::text() const | |
1127 { | |
1128 Q_D(const QMessageBox); | |
1129 return d->label->text(); | |
1130 } | |
1131 | |
1132 void QMessageBox::setText(const QString &text) | |
1133 { | |
1134 Q_D(QMessageBox); | |
1135 d->label->setText(text); | |
1136 d->label->setWordWrap(d->label->textFormat() == Qt::RichText | |
1137 || (d->label->textFormat() == Qt::AutoText && Qt::mightBeRichText(text))); | |
1138 d->updateSize(); | |
1139 } | |
1140 | |
1141 /*! | |
1142 \enum QMessageBox::Icon | |
1143 | |
1144 This enum has the following values: | |
1145 | |
1146 \value NoIcon the message box does not have any icon. | |
1147 | |
1148 \value Question an icon indicating that | |
1149 the message is asking a question. | |
1150 | |
1151 \value Information an icon indicating that | |
1152 the message is nothing out of the ordinary. | |
1153 | |
1154 \value Warning an icon indicating that the | |
1155 message is a warning, but can be dealt with. | |
1156 | |
1157 \value Critical an icon indicating that | |
1158 the message represents a critical problem. | |
1159 | |
1160 */ | |
1161 | |
1162 /*! | |
1163 \property QMessageBox::icon | |
1164 \brief the message box's icon | |
1165 | |
1166 The icon of the message box can be specified with one of the | |
1167 values: | |
1168 | |
1169 \list | |
1170 \o QMessageBox::NoIcon | |
1171 \o QMessageBox::Question | |
1172 \o QMessageBox::Information | |
1173 \o QMessageBox::Warning | |
1174 \o QMessageBox::Critical | |
1175 \endlist | |
1176 | |
1177 The default is QMessageBox::NoIcon. | |
1178 | |
1179 The pixmap used to display the actual icon depends on the current | |
1180 \l{QWidget::style()} {GUI style}. You can also set a custom pixmap | |
1181 for the icon by setting the \l{QMessageBox::iconPixmap} {icon | |
1182 pixmap} property. | |
1183 | |
1184 \sa iconPixmap | |
1185 */ | |
1186 QMessageBox::Icon QMessageBox::icon() const | |
1187 { | |
1188 Q_D(const QMessageBox); | |
1189 return d->icon; | |
1190 } | |
1191 | |
1192 void QMessageBox::setIcon(Icon icon) | |
1193 { | |
1194 Q_D(QMessageBox); | |
1195 setIconPixmap(QMessageBoxPrivate::standardIcon((QMessageBox::Icon)icon, | |
1196 this)); | |
1197 d->icon = icon; | |
1198 } | |
1199 | |
1200 /*! | |
1201 \property QMessageBox::iconPixmap | |
1202 \brief the current icon | |
1203 | |
1204 The icon currently used by the message box. Note that it's often | |
1205 hard to draw one pixmap that looks appropriate in all GUI styles; | |
1206 you may want to supply a different pixmap for each platform. | |
1207 | |
1208 By default, this property is undefined. | |
1209 | |
1210 \sa icon | |
1211 */ | |
1212 QPixmap QMessageBox::iconPixmap() const | |
1213 { | |
1214 Q_D(const QMessageBox); | |
1215 if (d->iconLabel && d->iconLabel->pixmap()) | |
1216 return *d->iconLabel->pixmap(); | |
1217 return QPixmap(); | |
1218 } | |
1219 | |
1220 void QMessageBox::setIconPixmap(const QPixmap &pixmap) | |
1221 { | |
1222 Q_D(QMessageBox); | |
1223 d->iconLabel->setPixmap(pixmap); | |
1224 d->updateSize(); | |
1225 d->icon = NoIcon; | |
1226 } | |
1227 | |
1228 /*! | |
1229 \property QMessageBox::textFormat | |
1230 \brief the format of the text displayed by the message box | |
1231 | |
1232 The current text format used by the message box. See the \l | |
1233 Qt::TextFormat enum for an explanation of the possible options. | |
1234 | |
1235 The default format is Qt::AutoText. | |
1236 | |
1237 \sa setText() | |
1238 */ | |
1239 Qt::TextFormat QMessageBox::textFormat() const | |
1240 { | |
1241 Q_D(const QMessageBox); | |
1242 return d->label->textFormat(); | |
1243 } | |
1244 | |
1245 void QMessageBox::setTextFormat(Qt::TextFormat format) | |
1246 { | |
1247 Q_D(QMessageBox); | |
1248 d->label->setTextFormat(format); | |
1249 d->label->setWordWrap(format == Qt::RichText | |
1250 || (format == Qt::AutoText && Qt::mightBeRichText(d->label->text()))); | |
1251 d->updateSize(); | |
1252 } | |
1253 | |
1254 /*! | |
1255 \reimp | |
1256 */ | |
1257 bool QMessageBox::event(QEvent *e) | |
1258 { | |
1259 bool result =QDialog::event(e); | |
1260 switch (e->type()) { | |
1261 case QEvent::LayoutRequest: | |
1262 d_func()->updateSize(); | |
1263 break; | |
1264 case QEvent::LanguageChange: | |
1265 d_func()->retranslateStrings(); | |
1266 break; | |
1267 #ifdef Q_WS_WINCE | |
1268 case QEvent::OkRequest: | |
1269 case QEvent::HelpRequest: { | |
1270 QString bName = | |
1271 (e->type() == QEvent::OkRequest) | |
1272 ? QApplication::translate("QMessageBox", "OK") | |
1273 : QApplication::translate("QMessageBox", "Help"); | |
1274 QList<QPushButton*> list = findChildren<QPushButton*>(); | |
1275 for (int i=0; i<list.size(); ++i) { | |
1276 QPushButton *pb = list.at(i); | |
1277 if (pb->text() == bName) { | |
1278 if (pb->isEnabled()) | |
1279 pb->click(); | |
1280 return pb->isEnabled(); | |
1281 } | |
1282 } | |
1283 } | |
1284 #endif | |
1285 default: | |
1286 break; | |
1287 } | |
1288 return result; | |
1289 } | |
1290 | |
1291 /*! | |
1292 \reimp | |
1293 */ | |
1294 void QMessageBox::resizeEvent(QResizeEvent *event) | |
1295 { | |
1296 QDialog::resizeEvent(event); | |
1297 } | |
1298 | |
1299 /*! | |
1300 \reimp | |
1301 */ | |
1302 void QMessageBox::closeEvent(QCloseEvent *e) | |
1303 { | |
1304 Q_D(QMessageBox); | |
1305 if (!d->detectedEscapeButton) { | |
1306 e->ignore(); | |
1307 return; | |
1308 } | |
1309 QDialog::closeEvent(e); | |
1310 d->clickedButton = d->detectedEscapeButton; | |
1311 setResult(d->execReturnCode(d->detectedEscapeButton)); | |
1312 } | |
1313 | |
1314 /*! | |
1315 \reimp | |
1316 */ | |
1317 void QMessageBox::changeEvent(QEvent *ev) | |
1318 { | |
1319 Q_D(QMessageBox); | |
1320 switch (ev->type()) { | |
1321 case QEvent::StyleChange: | |
1322 { | |
1323 if (d->icon != NoIcon) | |
1324 setIcon(d->icon); | |
1325 Qt::TextInteractionFlags flags(style()->styleHint(QStyle::SH_MessageBox_TextInteractionFlags, 0, this)); | |
1326 d->label->setTextInteractionFlags(flags); | |
1327 d->buttonBox->setCenterButtons(style()->styleHint(QStyle::SH_MessageBox_CenterButtons, 0, this)); | |
1328 if (d->informativeLabel) | |
1329 d->informativeLabel->setTextInteractionFlags(flags); | |
1330 // intentional fall through | |
1331 } | |
1332 case QEvent::FontChange: | |
1333 case QEvent::ApplicationFontChange: | |
1334 #ifdef Q_WS_MAC | |
1335 { | |
1336 QFont f = font(); | |
1337 f.setBold(true); | |
1338 d->label->setFont(f); | |
1339 } | |
1340 #endif | |
1341 default: | |
1342 break; | |
1343 } | |
1344 QDialog::changeEvent(ev); | |
1345 } | |
1346 | |
1347 /*! | |
1348 \reimp | |
1349 */ | |
1350 void QMessageBox::keyPressEvent(QKeyEvent *e) | |
1351 { | |
1352 Q_D(QMessageBox); | |
1353 if (e->key() == Qt::Key_Escape | |
1354 #ifdef Q_WS_MAC | |
1355 || (e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Period) | |
1356 #endif | |
1357 ) { | |
1358 if (d->detectedEscapeButton) { | |
1359 #ifdef Q_WS_MAC | |
1360 d->detectedEscapeButton->animateClick(); | |
1361 #else | |
1362 d->detectedEscapeButton->click(); | |
1363 #endif | |
1364 } | |
1365 return; | |
1366 } | |
1367 | |
1368 #if defined (Q_OS_WIN) && !defined(QT_NO_CLIPBOARD) && !defined(QT_NO_SHORTCUT) | |
1369 if (e == QKeySequence::Copy) { | |
1370 QString separator = QString::fromLatin1("---------------------------\n"); | |
1371 QString textToCopy = separator; | |
1372 separator.prepend(QLatin1Char('\n')); | |
1373 textToCopy += windowTitle() + separator; // title | |
1374 textToCopy += d->label->text() + separator; // text | |
1375 | |
1376 if (d->informativeLabel) | |
1377 textToCopy += d->informativeLabel->text() + separator; | |
1378 | |
1379 QString buttonTexts; | |
1380 QList<QAbstractButton *> buttons = d->buttonBox->buttons(); | |
1381 for (int i = 0; i < buttons.count(); i++) { | |
1382 buttonTexts += buttons[i]->text() + QLatin1String(" "); | |
1383 } | |
1384 textToCopy += buttonTexts + separator; | |
1385 | |
1386 QApplication::clipboard()->setText(textToCopy); | |
1387 return; | |
1388 } | |
1389 #endif //QT_NO_SHORTCUT QT_NO_CLIPBOARD Q_OS_WIN | |
1390 | |
1391 #ifndef QT_NO_SHORTCUT | |
1392 if (!(e->modifiers() & Qt::AltModifier)) { | |
1393 int key = e->key() & ~((int)Qt::MODIFIER_MASK|(int)Qt::UNICODE_ACCEL); | |
1394 if (key) { | |
1395 const QList<QAbstractButton *> buttons = d->buttonBox->buttons(); | |
1396 for (int i = 0; i < buttons.count(); ++i) { | |
1397 QAbstractButton *pb = buttons.at(i); | |
1398 int acc = pb->shortcut() & ~((int)Qt::MODIFIER_MASK|(int)Qt::UNICODE_ACCEL); | |
1399 if (acc == key) { | |
1400 pb->animateClick(); | |
1401 return; | |
1402 } | |
1403 } | |
1404 } | |
1405 } | |
1406 #endif | |
1407 QDialog::keyPressEvent(e); | |
1408 } | |
1409 | |
1410 #ifdef Q_WS_WINCE | |
1411 /*! | |
1412 \reimp | |
1413 */ | |
1414 void QMessageBox::setVisible(bool visible) | |
1415 { | |
1416 Q_D(QMessageBox); | |
1417 if (visible) | |
1418 d->hideSpecial(); | |
1419 QDialog::setVisible(visible); | |
1420 } | |
1421 #endif | |
1422 | |
1423 | |
1424 /*! | |
1425 \overload | |
1426 | |
1427 Opens the dialog and connects its finished() or buttonClicked() signal to | |
1428 the slot specified by \a receiver and \a member. If the slot in \a member | |
1429 has a pointer for its first parameter the connection is to buttonClicked(), | |
1430 otherwise the connection is to finished(). | |
1431 | |
1432 The signal will be disconnected from the slot when the dialog is closed. | |
1433 */ | |
1434 void QMessageBox::open(QObject *receiver, const char *member) | |
1435 { | |
1436 Q_D(QMessageBox); | |
1437 const char *signal = member && strchr(member, '*') ? SIGNAL(buttonClicked(QAbstractButton*)) | |
1438 : SIGNAL(finished(int)); | |
1439 connect(this, signal, receiver, member); | |
1440 d->signalToDisconnectOnClose = signal; | |
1441 d->receiverToDisconnectOnClose = receiver; | |
1442 d->memberToDisconnectOnClose = member; | |
1443 QDialog::open(); | |
1444 } | |
1445 | |
1446 /*! | |
1447 \since 4.5 | |
1448 | |
1449 Returns a list of all the buttons that have been added to the message box. | |
1450 | |
1451 \sa buttonRole(), addButton(), removeButton() | |
1452 */ | |
1453 QList<QAbstractButton *> QMessageBox::buttons() const | |
1454 { | |
1455 Q_D(const QMessageBox); | |
1456 return d->buttonBox->buttons(); | |
1457 } | |
1458 | |
1459 /*! | |
1460 \since 4.5 | |
1461 | |
1462 Returns the button role for the specified \a button. This function returns | |
1463 \l InvalidRole if \a button is 0 or has not been added to the message box. | |
1464 | |
1465 \sa buttons(), addButton() | |
1466 */ | |
1467 QMessageBox::ButtonRole QMessageBox::buttonRole(QAbstractButton *button) const | |
1468 { | |
1469 Q_D(const QMessageBox); | |
1470 return QMessageBox::ButtonRole(d->buttonBox->buttonRole(button)); | |
1471 } | |
1472 | |
1473 /*! | |
1474 \reimp | |
1475 */ | |
1476 void QMessageBox::showEvent(QShowEvent *e) | |
1477 { | |
1478 Q_D(QMessageBox); | |
1479 if (d->autoAddOkButton) { | |
1480 addButton(Ok); | |
1481 #if defined(Q_WS_WINCE) | |
1482 d->hideSpecial(); | |
1483 #endif | |
1484 } | |
1485 if (d->detailsButton) | |
1486 addButton(d->detailsButton, QMessageBox::ActionRole); | |
1487 d->detectEscapeButton(); | |
1488 d->updateSize(); | |
1489 | |
1490 #ifndef QT_NO_ACCESSIBILITY | |
1491 QAccessible::updateAccessibility(this, 0, QAccessible::Alert); | |
1492 #endif | |
1493 #ifdef Q_WS_WIN | |
1494 HMENU systemMenu = GetSystemMenu((HWND)winId(), FALSE); | |
1495 if (!d->detectedEscapeButton) { | |
1496 EnableMenuItem(systemMenu, SC_CLOSE, MF_BYCOMMAND|MF_GRAYED); | |
1497 } | |
1498 else { | |
1499 EnableMenuItem(systemMenu, SC_CLOSE, MF_BYCOMMAND|MF_ENABLED); | |
1500 } | |
1501 #endif | |
1502 QDialog::showEvent(e); | |
1503 } | |
1504 | |
1505 | |
1506 static QMessageBox::StandardButton showNewMessageBox(QWidget *parent, | |
1507 QMessageBox::Icon icon, | |
1508 const QString& title, const QString& text, | |
1509 QMessageBox::StandardButtons buttons, | |
1510 QMessageBox::StandardButton defaultButton) | |
1511 { | |
1512 // necessary for source compatibility with Qt 4.0 and 4.1 | |
1513 // handles (Yes, No) and (Yes|Default, No) | |
1514 if (defaultButton && !(buttons & defaultButton)) | |
1515 return (QMessageBox::StandardButton) | |
1516 QMessageBoxPrivate::showOldMessageBox(parent, icon, title, | |
1517 text, int(buttons), | |
1518 int(defaultButton), 0); | |
1519 | |
1520 QMessageBox msgBox(icon, title, text, QMessageBox::NoButton, parent); | |
1521 QDialogButtonBox *buttonBox = msgBox.findChild<QDialogButtonBox*>(); | |
1522 Q_ASSERT(buttonBox != 0); | |
1523 | |
1524 uint mask = QMessageBox::FirstButton; | |
1525 while (mask <= QMessageBox::LastButton) { | |
1526 uint sb = buttons & mask; | |
1527 mask <<= 1; | |
1528 if (!sb) | |
1529 continue; | |
1530 QPushButton *button = msgBox.addButton((QMessageBox::StandardButton)sb); | |
1531 // Choose the first accept role as the default | |
1532 if (msgBox.defaultButton()) | |
1533 continue; | |
1534 if ((defaultButton == QMessageBox::NoButton && buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole) | |
1535 || (defaultButton != QMessageBox::NoButton && sb == uint(defaultButton))) | |
1536 msgBox.setDefaultButton(button); | |
1537 } | |
1538 if (msgBox.exec() == -1) | |
1539 return QMessageBox::Cancel; | |
1540 return msgBox.standardButton(msgBox.clickedButton()); | |
1541 } | |
1542 | |
1543 /*! | |
1544 \since 4.2 | |
1545 | |
1546 Opens an information message box with the given \a title and | |
1547 \a text in front of the specified \a parent widget. | |
1548 | |
1549 The standard \a buttons are added to the message box. | |
1550 \a defaultButton specifies the button used when \key Enter is pressed. | |
1551 \a defaultButton must refer to a button that was given in \a buttons. | |
1552 If \a defaultButton is QMessageBox::NoButton, QMessageBox | |
1553 chooses a suitable default automatically. | |
1554 | |
1555 Returns the identity of the standard button that was clicked. If | |
1556 \key Esc was pressed instead, the \l{Default and Escape Keys} | |
1557 {escape button} is returned. | |
1558 | |
1559 The message box is an \l{Qt::ApplicationModal}{application modal} | |
1560 dialog box. | |
1561 | |
1562 \warning Do not delete \a parent during the execution of the dialog. | |
1563 If you want to do this, you should create the dialog | |
1564 yourself using one of the QMessageBox constructors. | |
1565 | |
1566 \sa question(), warning(), critical() | |
1567 */ | |
1568 QMessageBox::StandardButton QMessageBox::information(QWidget *parent, const QString &title, | |
1569 const QString& text, StandardButtons buttons, | |
1570 StandardButton defaultButton) | |
1571 { | |
1572 return showNewMessageBox(parent, Information, title, text, buttons, | |
1573 defaultButton); | |
1574 } | |
1575 | |
1576 | |
1577 /*! | |
1578 \since 4.2 | |
1579 | |
1580 Opens a question message box with the given \a title and \a | |
1581 text in front of the specified \a parent widget. | |
1582 | |
1583 The standard \a buttons are added to the message box. \a | |
1584 defaultButton specifies the button used when \key Enter is | |
1585 pressed. \a defaultButton must refer to a button that was given in \a buttons. | |
1586 If \a defaultButton is QMessageBox::NoButton, QMessageBox | |
1587 chooses a suitable default automatically. | |
1588 | |
1589 Returns the identity of the standard button that was clicked. If | |
1590 \key Esc was pressed instead, the \l{Default and Escape Keys} | |
1591 {escape button} is returned. | |
1592 | |
1593 The message box is an \l{Qt::ApplicationModal} {application modal} | |
1594 dialog box. | |
1595 | |
1596 \warning Do not delete \a parent during the execution of the dialog. | |
1597 If you want to do this, you should create the dialog | |
1598 yourself using one of the QMessageBox constructors. | |
1599 | |
1600 \sa information(), warning(), critical() | |
1601 */ | |
1602 QMessageBox::StandardButton QMessageBox::question(QWidget *parent, const QString &title, | |
1603 const QString& text, StandardButtons buttons, | |
1604 StandardButton defaultButton) | |
1605 { | |
1606 return showNewMessageBox(parent, Question, title, text, buttons, defaultButton); | |
1607 } | |
1608 | |
1609 /*! | |
1610 \since 4.2 | |
1611 | |
1612 Opens a warning message box with the given \a title and \a | |
1613 text in front of the specified \a parent widget. | |
1614 | |
1615 The standard \a buttons are added to the message box. \a | |
1616 defaultButton specifies the button used when \key Enter is | |
1617 pressed. \a defaultButton must refer to a button that was given in \a buttons. | |
1618 If \a defaultButton is QMessageBox::NoButton, QMessageBox | |
1619 chooses a suitable default automatically. | |
1620 | |
1621 Returns the identity of the standard button that was clicked. If | |
1622 \key Esc was pressed instead, the \l{Default and Escape Keys} | |
1623 {escape button} is returned. | |
1624 | |
1625 The message box is an \l{Qt::ApplicationModal} {application modal} | |
1626 dialog box. | |
1627 | |
1628 \warning Do not delete \a parent during the execution of the dialog. | |
1629 If you want to do this, you should create the dialog | |
1630 yourself using one of the QMessageBox constructors. | |
1631 | |
1632 \sa question(), information(), critical() | |
1633 */ | |
1634 QMessageBox::StandardButton QMessageBox::warning(QWidget *parent, const QString &title, | |
1635 const QString& text, StandardButtons buttons, | |
1636 StandardButton defaultButton) | |
1637 { | |
1638 return showNewMessageBox(parent, Warning, title, text, buttons, defaultButton); | |
1639 } | |
1640 | |
1641 /*! | |
1642 \since 4.2 | |
1643 | |
1644 Opens a critical message box with the given \a title and \a | |
1645 text in front of the specified \a parent widget. | |
1646 | |
1647 The standard \a buttons are added to the message box. \a | |
1648 defaultButton specifies the button used when \key Enter is | |
1649 pressed. \a defaultButton must refer to a button that was given in \a buttons. | |
1650 If \a defaultButton is QMessageBox::NoButton, QMessageBox | |
1651 chooses a suitable default automatically. | |
1652 | |
1653 Returns the identity of the standard button that was clicked. If | |
1654 \key Esc was pressed instead, the \l{Default and Escape Keys} | |
1655 {escape button} is returned. | |
1656 | |
1657 The message box is an \l{Qt::ApplicationModal} {application modal} | |
1658 dialog box. | |
1659 | |
1660 \warning Do not delete \a parent during the execution of the dialog. | |
1661 If you want to do this, you should create the dialog | |
1662 yourself using one of the QMessageBox constructors. | |
1663 | |
1664 \sa question(), warning(), information() | |
1665 */ | |
1666 QMessageBox::StandardButton QMessageBox::critical(QWidget *parent, const QString &title, | |
1667 const QString& text, StandardButtons buttons, | |
1668 StandardButton defaultButton) | |
1669 { | |
1670 return showNewMessageBox(parent, Critical, title, text, buttons, defaultButton); | |
1671 } | |
1672 | |
1673 /*! | |
1674 Displays a simple about box with title \a title and text \a | |
1675 text. The about box's parent is \a parent. | |
1676 | |
1677 about() looks for a suitable icon in four locations: | |
1678 | |
1679 \list 1 | |
1680 \o It prefers \link QWidget::windowIcon() parent->icon() \endlink | |
1681 if that exists. | |
1682 \o If not, it tries the top-level widget containing \a parent. | |
1683 \o If that fails, it tries the \link | |
1684 QApplication::activeWindow() active window. \endlink | |
1685 \o As a last resort it uses the Information icon. | |
1686 \endlist | |
1687 | |
1688 The about box has a single button labelled "OK". On Mac OS X, the | |
1689 about box is popped up as a modeless window; on other platforms, | |
1690 it is currently application modal. | |
1691 | |
1692 \sa QWidget::windowIcon(), QApplication::activeWindow() | |
1693 */ | |
1694 void QMessageBox::about(QWidget *parent, const QString &title, const QString &text) | |
1695 { | |
1696 #ifdef Q_WS_MAC | |
1697 static QPointer<QMessageBox> oldMsgBox; | |
1698 | |
1699 if (oldMsgBox && oldMsgBox->text() == text) { | |
1700 oldMsgBox->show(); | |
1701 oldMsgBox->raise(); | |
1702 oldMsgBox->activateWindow(); | |
1703 return; | |
1704 } | |
1705 #endif | |
1706 | |
1707 QMessageBox *msgBox = new QMessageBox(title, text, Information, 0, 0, 0, parent | |
1708 #ifdef Q_WS_MAC | |
1709 , Qt::WindowTitleHint | Qt::WindowSystemMenuHint | |
1710 #endif | |
1711 ); | |
1712 msgBox->setAttribute(Qt::WA_DeleteOnClose); | |
1713 QIcon icon = msgBox->windowIcon(); | |
1714 QSize size = icon.actualSize(QSize(64, 64)); | |
1715 msgBox->setIconPixmap(icon.pixmap(size)); | |
1716 | |
1717 // should perhaps be a style hint | |
1718 #ifdef Q_WS_MAC | |
1719 oldMsgBox = msgBox; | |
1720 #if 0 | |
1721 // ### doesn't work until close button is enabled in title bar | |
1722 msgBox->d_func()->autoAddOkButton = false; | |
1723 #else | |
1724 msgBox->d_func()->buttonBox->setCenterButtons(true); | |
1725 #endif | |
1726 msgBox->show(); | |
1727 #else | |
1728 msgBox->exec(); | |
1729 #endif | |
1730 } | |
1731 | |
1732 /*! | |
1733 Displays a simple message box about Qt, with the given \a title | |
1734 and centered over \a parent (if \a parent is not 0). The message | |
1735 includes the version number of Qt being used by the application. | |
1736 | |
1737 This is useful for inclusion in the \gui Help menu of an application, | |
1738 as shown in the \l{mainwindows/menus}{Menus} example. | |
1739 | |
1740 QApplication provides this functionality as a slot. | |
1741 | |
1742 On Mac OS X, the about box is popped up as a modeless window; on | |
1743 other platforms, it is currently application modal. | |
1744 | |
1745 \sa QApplication::aboutQt() | |
1746 */ | |
1747 void QMessageBox::aboutQt(QWidget *parent, const QString &title) | |
1748 { | |
1749 #ifdef Q_WS_MAC | |
1750 static QPointer<QMessageBox> oldMsgBox; | |
1751 | |
1752 if (oldMsgBox) { | |
1753 oldMsgBox->show(); | |
1754 oldMsgBox->raise(); | |
1755 oldMsgBox->activateWindow(); | |
1756 return; | |
1757 } | |
1758 #endif | |
1759 | |
1760 QString translatedTextAboutQtCaption; | |
1761 translatedTextAboutQtCaption = QMessageBox::tr( | |
1762 "<h3>About Qt</h3>" | |
1763 "<p>This program uses Qt version %1.</p>" | |
1764 ).arg(QLatin1String(QT_VERSION_STR)); | |
1765 QString translatedTextAboutQtText; | |
1766 translatedTextAboutQtText = QMessageBox::tr( | |
1767 "<p>Qt is a C++ toolkit for cross-platform application " | |
1768 "development.</p>" | |
1769 "<p>Qt provides single-source portability across all major desktop " | |
1770 "operating systems. It is also available for embedded Linux and other " | |
1771 "embedded and mobile operating systems.</p>" | |
1772 "<p>Qt is available under three different licensing options designed " | |
1773 "to accommodate the needs of our various users.</p>" | |
1774 "<p>Qt licensed under our commercial license agreement is appropriate " | |
1775 "for development of proprietary/commercial software where you do not " | |
1776 "want to share any source code with third parties or otherwise cannot " | |
1777 "comply with the terms of the GNU LGPL version 3 or GNU LGPL version 2.1.</p>" | |
1778 "<p>Qt licensed under the GNU LGPL version 3 is appropriate for the " | |
1779 "development of Qt applications provided you can comply with the terms " | |
1780 "and conditions of the GNU LGPL version 3.</p>" | |
1781 "<p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the " | |
1782 "development of Qt applications provided you can comply with the terms " | |
1783 "and conditions of the GNU LGPL version 2.1.</p>" | |
1784 "<p>Please see <a href=\"http://%2/\">%2</a> " | |
1785 "for an overview of Qt licensing.</p>" | |
1786 "<p>Copyright (C) %1 The Qt Company Ltd and other " | |
1787 "contributors.</p>" | |
1788 "<p>Qt and the Qt logo are trademarks of The Qt Company Ltd.</p>" | |
1789 "<p>Qt is The Qt Company Ltd product developed as an open source " | |
1790 "project. See <a href=\"http://%3/\">%3</a> for more information.</p>" | |
1791 ).arg(QLatin1String("2015"), | |
1792 QLatin1String("qt.io/licensing"), | |
1793 QLatin1String("qt.io")); | |
1794 QMessageBox *msgBox = new QMessageBox(parent); | |
1795 msgBox->setAttribute(Qt::WA_DeleteOnClose); | |
1796 msgBox->setWindowTitle(title.isEmpty() ? tr("About Qt") : title); | |
1797 msgBox->setText(translatedTextAboutQtCaption); | |
1798 msgBox->setInformativeText(translatedTextAboutQtText); | |
1799 | |
1800 QPixmap pm(QLatin1String(":/trolltech/qmessagebox/images/qtlogo-64.png")); | |
1801 if (!pm.isNull()) | |
1802 msgBox->setIconPixmap(pm); | |
1803 #if defined(Q_WS_WINCE) | |
1804 msgBox->setDefaultButton(msgBox->addButton(QMessageBox::Ok)); | |
1805 #endif | |
1806 | |
1807 // should perhaps be a style hint | |
1808 #ifdef Q_WS_MAC | |
1809 oldMsgBox = msgBox; | |
1810 #if 0 | |
1811 // ### doesn't work until close button is enabled in title bar | |
1812 msgBox->d_func()->autoAddOkButton = false; | |
1813 #else | |
1814 msgBox->d_func()->buttonBox->setCenterButtons(true); | |
1815 #endif | |
1816 msgBox->show(); | |
1817 #else | |
1818 msgBox->exec(); | |
1819 #endif | |
1820 } | |
1821 | |
1822 /*! | |
1823 \internal | |
1824 */ | |
1825 QSize QMessageBox::sizeHint() const | |
1826 { | |
1827 // ### Qt 5: remove | |
1828 return QDialog::sizeHint(); | |
1829 } | |
1830 | |
1831 ///////////////////////////////////////////////////////////////////////////////////////// | |
1832 // Source and binary compatibility routines for 4.0 and 4.1 | |
1833 | |
1834 static QMessageBox::StandardButton newButton(int button) | |
1835 { | |
1836 // this is needed for source compatibility with Qt 4.0 and 4.1 | |
1837 if (button == QMessageBox::NoButton || (button & NewButtonMask)) | |
1838 return QMessageBox::StandardButton(button & QMessageBox::ButtonMask); | |
1839 | |
1840 #if QT_VERSION < 0x050000 | |
1841 // this is needed for binary compatibility with Qt 4.0 and 4.1 | |
1842 switch (button & Old_ButtonMask) { | |
1843 case Old_Ok: | |
1844 return QMessageBox::Ok; | |
1845 case Old_Cancel: | |
1846 return QMessageBox::Cancel; | |
1847 case Old_Yes: | |
1848 return QMessageBox::Yes; | |
1849 case Old_No: | |
1850 return QMessageBox::No; | |
1851 case Old_Abort: | |
1852 return QMessageBox::Abort; | |
1853 case Old_Retry: | |
1854 return QMessageBox::Retry; | |
1855 case Old_Ignore: | |
1856 return QMessageBox::Ignore; | |
1857 case Old_YesAll: | |
1858 return QMessageBox::YesToAll; | |
1859 case Old_NoAll: | |
1860 return QMessageBox::NoToAll; | |
1861 default: | |
1862 return QMessageBox::NoButton; | |
1863 } | |
1864 #endif | |
1865 } | |
1866 | |
1867 static bool detectedCompat(int button0, int button1, int button2) | |
1868 { | |
1869 if (button0 != 0 && !(button0 & NewButtonMask)) | |
1870 return true; | |
1871 if (button1 != 0 && !(button1 & NewButtonMask)) | |
1872 return true; | |
1873 if (button2 != 0 && !(button2 & NewButtonMask)) | |
1874 return true; | |
1875 return false; | |
1876 } | |
1877 | |
1878 QAbstractButton *QMessageBoxPrivate::findButton(int button0, int button1, int button2, int flags) | |
1879 { | |
1880 Q_Q(QMessageBox); | |
1881 int button = 0; | |
1882 | |
1883 if (button0 & flags) { | |
1884 button = button0; | |
1885 } else if (button1 & flags) { | |
1886 button = button1; | |
1887 } else if (button2 & flags) { | |
1888 button = button2; | |
1889 } | |
1890 return q->button(newButton(button)); | |
1891 } | |
1892 | |
1893 void QMessageBoxPrivate::addOldButtons(int button0, int button1, int button2) | |
1894 { | |
1895 Q_Q(QMessageBox); | |
1896 q->addButton(newButton(button0)); | |
1897 q->addButton(newButton(button1)); | |
1898 q->addButton(newButton(button2)); | |
1899 q->setDefaultButton( | |
1900 static_cast<QPushButton *>(findButton(button0, button1, button2, QMessageBox::Default))); | |
1901 q->setEscapeButton(findButton(button0, button1, button2, QMessageBox::Escape)); | |
1902 compatMode = detectedCompat(button0, button1, button2); | |
1903 } | |
1904 | |
1905 QAbstractButton *QMessageBoxPrivate::abstractButtonForId(int id) const | |
1906 { | |
1907 Q_Q(const QMessageBox); | |
1908 QAbstractButton *result = customButtonList.value(id); | |
1909 if (result) | |
1910 return result; | |
1911 if (id & QMessageBox::FlagMask) // for compatibility with Qt 4.0/4.1 (even if it is silly) | |
1912 return 0; | |
1913 return q->button(newButton(id)); | |
1914 } | |
1915 | |
1916 int QMessageBoxPrivate::showOldMessageBox(QWidget *parent, QMessageBox::Icon icon, | |
1917 const QString &title, const QString &text, | |
1918 int button0, int button1, int button2) | |
1919 { | |
1920 QMessageBox messageBox(icon, title, text, QMessageBox::NoButton, parent); | |
1921 messageBox.d_func()->addOldButtons(button0, button1, button2); | |
1922 return messageBox.exec(); | |
1923 } | |
1924 | |
1925 int QMessageBoxPrivate::showOldMessageBox(QWidget *parent, QMessageBox::Icon icon, | |
1926 const QString &title, const QString &text, | |
1927 const QString &button0Text, | |
1928 const QString &button1Text, | |
1929 const QString &button2Text, | |
1930 int defaultButtonNumber, | |
1931 int escapeButtonNumber) | |
1932 { | |
1933 QMessageBox messageBox(icon, title, text, QMessageBox::NoButton, parent); | |
1934 QString myButton0Text = button0Text; | |
1935 if (myButton0Text.isEmpty()) | |
1936 myButton0Text = QDialogButtonBox::tr("OK"); | |
1937 messageBox.addButton(myButton0Text, QMessageBox::ActionRole); | |
1938 if (!button1Text.isEmpty()) | |
1939 messageBox.addButton(button1Text, QMessageBox::ActionRole); | |
1940 if (!button2Text.isEmpty()) | |
1941 messageBox.addButton(button2Text, QMessageBox::ActionRole); | |
1942 | |
1943 const QList<QAbstractButton *> &buttonList = messageBox.d_func()->customButtonList; | |
1944 messageBox.setDefaultButton(static_cast<QPushButton *>(buttonList.value(defaultButtonNumber))); | |
1945 messageBox.setEscapeButton(buttonList.value(escapeButtonNumber)); | |
1946 | |
1947 return messageBox.exec(); | |
1948 } | |
1949 | |
1950 void QMessageBoxPrivate::retranslateStrings() | |
1951 { | |
1952 #ifndef QT_NO_TEXTEDIT | |
1953 if (detailsButton) | |
1954 detailsButton->setLabel(detailsText->isHidden() ? ShowLabel : HideLabel); | |
1955 #endif | |
1956 } | |
1957 | |
1958 /*! | |
1959 \obsolete | |
1960 | |
1961 Constructs a message box with a \a title, a \a text, an \a icon, | |
1962 and up to three buttons. | |
1963 | |
1964 The \a icon must be one of the following: | |
1965 \list | |
1966 \o QMessageBox::NoIcon | |
1967 \o QMessageBox::Question | |
1968 \o QMessageBox::Information | |
1969 \o QMessageBox::Warning | |
1970 \o QMessageBox::Critical | |
1971 \endlist | |
1972 | |
1973 Each button, \a button0, \a button1 and \a button2, can have one | |
1974 of the following values: | |
1975 \list | |
1976 \o QMessageBox::NoButton | |
1977 \o QMessageBox::Ok | |
1978 \o QMessageBox::Cancel | |
1979 \o QMessageBox::Yes | |
1980 \o QMessageBox::No | |
1981 \o QMessageBox::Abort | |
1982 \o QMessageBox::Retry | |
1983 \o QMessageBox::Ignore | |
1984 \o QMessageBox::YesAll | |
1985 \o QMessageBox::NoAll | |
1986 \endlist | |
1987 | |
1988 Use QMessageBox::NoButton for the later parameters to have fewer | |
1989 than three buttons in your message box. If you don't specify any | |
1990 buttons at all, QMessageBox will provide an Ok button. | |
1991 | |
1992 One of the buttons can be OR-ed with the QMessageBox::Default | |
1993 flag to make it the default button (clicked when Enter is | |
1994 pressed). | |
1995 | |
1996 One of the buttons can be OR-ed with the QMessageBox::Escape flag | |
1997 to make it the cancel or close button (clicked when \key Esc is | |
1998 pressed). | |
1999 | |
2000 \snippet doc/src/snippets/dialogs/dialogs.cpp 2 | |
2001 | |
2002 The message box is an \l{Qt::ApplicationModal} {application modal} | |
2003 dialog box. | |
2004 | |
2005 The \a parent and \a f arguments are passed to | |
2006 the QDialog constructor. | |
2007 | |
2008 \sa setWindowTitle(), setText(), setIcon() | |
2009 */ | |
2010 QMessageBox::QMessageBox(const QString &title, const QString &text, Icon icon, | |
2011 int button0, int button1, int button2, QWidget *parent, | |
2012 Qt::WindowFlags f) | |
2013 : QDialog(*new QMessageBoxPrivate, parent, | |
2014 f /*| Qt::MSWindowsFixedSizeDialogHint #### */| Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint) | |
2015 { | |
2016 Q_D(QMessageBox); | |
2017 d->init(title, text); | |
2018 setIcon(icon); | |
2019 d->addOldButtons(button0, button1, button2); | |
2020 } | |
2021 | |
2022 /*! | |
2023 \obsolete | |
2024 | |
2025 Opens an information message box with the given \a title and the | |
2026 \a text. The dialog may have up to three buttons. Each of the | |
2027 buttons, \a button0, \a button1 and \a button2 may be set to one | |
2028 of the following values: | |
2029 | |
2030 \list | |
2031 \o QMessageBox::NoButton | |
2032 \o QMessageBox::Ok | |
2033 \o QMessageBox::Cancel | |
2034 \o QMessageBox::Yes | |
2035 \o QMessageBox::No | |
2036 \o QMessageBox::Abort | |
2037 \o QMessageBox::Retry | |
2038 \o QMessageBox::Ignore | |
2039 \o QMessageBox::YesAll | |
2040 \o QMessageBox::NoAll | |
2041 \endlist | |
2042 | |
2043 If you don't want all three buttons, set the last button, or last | |
2044 two buttons to QMessageBox::NoButton. | |
2045 | |
2046 One button can be OR-ed with QMessageBox::Default, and one | |
2047 button can be OR-ed with QMessageBox::Escape. | |
2048 | |
2049 Returns the identity (QMessageBox::Ok, or QMessageBox::No, etc.) | |
2050 of the button that was clicked. | |
2051 | |
2052 The message box is an \l{Qt::ApplicationModal} {application modal} | |
2053 dialog box. | |
2054 | |
2055 \warning Do not delete \a parent during the execution of the dialog. | |
2056 If you want to do this, you should create the dialog | |
2057 yourself using one of the QMessageBox constructors. | |
2058 | |
2059 \sa question(), warning(), critical() | |
2060 */ | |
2061 int QMessageBox::information(QWidget *parent, const QString &title, const QString& text, | |
2062 int button0, int button1, int button2) | |
2063 { | |
2064 return QMessageBoxPrivate::showOldMessageBox(parent, Information, title, text, | |
2065 button0, button1, button2); | |
2066 } | |
2067 | |
2068 /*! | |
2069 \obsolete | |
2070 \overload | |
2071 | |
2072 Displays an information message box with the given \a title and | |
2073 \a text, as well as one, two or three buttons. Returns the index | |
2074 of the button that was clicked (0, 1 or 2). | |
2075 | |
2076 \a button0Text is the text of the first button, and is optional. | |
2077 If \a button0Text is not supplied, "OK" (translated) will be | |
2078 used. \a button1Text is the text of the second button, and is | |
2079 optional. \a button2Text is the text of the third button, and is | |
2080 optional. \a defaultButtonNumber (0, 1 or 2) is the index of the | |
2081 default button; pressing Return or Enter is the same as clicking | |
2082 the default button. It defaults to 0 (the first button). \a | |
2083 escapeButtonNumber is the index of the escape button; pressing | |
2084 \key Esc is the same as clicking this button. It defaults to -1; | |
2085 supply 0, 1 or 2 to make pressing \key Esc equivalent to clicking | |
2086 the relevant button. | |
2087 | |
2088 The message box is an \l{Qt::ApplicationModal} {application modal} | |
2089 dialog box. | |
2090 | |
2091 \warning Do not delete \a parent during the execution of the dialog. | |
2092 If you want to do this, you should create the dialog | |
2093 yourself using one of the QMessageBox constructors. | |
2094 | |
2095 \sa question(), warning(), critical() | |
2096 */ | |
2097 | |
2098 int QMessageBox::information(QWidget *parent, const QString &title, const QString& text, | |
2099 const QString& button0Text, const QString& button1Text, | |
2100 const QString& button2Text, int defaultButtonNumber, | |
2101 int escapeButtonNumber) | |
2102 { | |
2103 return QMessageBoxPrivate::showOldMessageBox(parent, Information, title, text, | |
2104 button0Text, button1Text, button2Text, | |
2105 defaultButtonNumber, escapeButtonNumber); | |
2106 } | |
2107 | |
2108 /*! | |
2109 \obsolete | |
2110 | |
2111 Opens a question message box with the given \a title and \a text. | |
2112 The dialog may have up to three buttons. Each of the buttons, \a | |
2113 button0, \a button1 and \a button2 may be set to one of the | |
2114 following values: | |
2115 | |
2116 \list | |
2117 \o QMessageBox::NoButton | |
2118 \o QMessageBox::Ok | |
2119 \o QMessageBox::Cancel | |
2120 \o QMessageBox::Yes | |
2121 \o QMessageBox::No | |
2122 \o QMessageBox::Abort | |
2123 \o QMessageBox::Retry | |
2124 \o QMessageBox::Ignore | |
2125 \o QMessageBox::YesAll | |
2126 \o QMessageBox::NoAll | |
2127 \endlist | |
2128 | |
2129 If you don't want all three buttons, set the last button, or last | |
2130 two buttons to QMessageBox::NoButton. | |
2131 | |
2132 One button can be OR-ed with QMessageBox::Default, and one | |
2133 button can be OR-ed with QMessageBox::Escape. | |
2134 | |
2135 Returns the identity (QMessageBox::Yes, or QMessageBox::No, etc.) | |
2136 of the button that was clicked. | |
2137 | |
2138 The message box is an \l{Qt::ApplicationModal} {application modal} | |
2139 dialog box. | |
2140 | |
2141 \warning Do not delete \a parent during the execution of the dialog. | |
2142 If you want to do this, you should create the dialog | |
2143 yourself using one of the QMessageBox constructors. | |
2144 | |
2145 \sa information(), warning(), critical() | |
2146 */ | |
2147 int QMessageBox::question(QWidget *parent, const QString &title, const QString& text, | |
2148 int button0, int button1, int button2) | |
2149 { | |
2150 return QMessageBoxPrivate::showOldMessageBox(parent, Question, title, text, | |
2151 button0, button1, button2); | |
2152 } | |
2153 | |
2154 /*! | |
2155 \obsolete | |
2156 \overload | |
2157 | |
2158 Displays a question message box with the given \a title and \a | |
2159 text, as well as one, two or three buttons. Returns the index of | |
2160 the button that was clicked (0, 1 or 2). | |
2161 | |
2162 \a button0Text is the text of the first button, and is optional. | |
2163 If \a button0Text is not supplied, "OK" (translated) will be used. | |
2164 \a button1Text is the text of the second button, and is optional. | |
2165 \a button2Text is the text of the third button, and is optional. | |
2166 \a defaultButtonNumber (0, 1 or 2) is the index of the default | |
2167 button; pressing Return or Enter is the same as clicking the | |
2168 default button. It defaults to 0 (the first button). \a | |
2169 escapeButtonNumber is the index of the Escape button; pressing | |
2170 Escape is the same as clicking this button. It defaults to -1; | |
2171 supply 0, 1 or 2 to make pressing Escape equivalent to clicking | |
2172 the relevant button. | |
2173 | |
2174 The message box is an \l{Qt::ApplicationModal} {application modal} | |
2175 dialog box. | |
2176 | |
2177 \warning Do not delete \a parent during the execution of the dialog. | |
2178 If you want to do this, you should create the dialog | |
2179 yourself using one of the QMessageBox constructors. | |
2180 | |
2181 \sa information(), warning(), critical() | |
2182 */ | |
2183 int QMessageBox::question(QWidget *parent, const QString &title, const QString& text, | |
2184 const QString& button0Text, const QString& button1Text, | |
2185 const QString& button2Text, int defaultButtonNumber, | |
2186 int escapeButtonNumber) | |
2187 { | |
2188 return QMessageBoxPrivate::showOldMessageBox(parent, Question, title, text, | |
2189 button0Text, button1Text, button2Text, | |
2190 defaultButtonNumber, escapeButtonNumber); | |
2191 } | |
2192 | |
2193 | |
2194 /*! | |
2195 \obsolete | |
2196 | |
2197 Opens a warning message box with the given \a title and \a text. | |
2198 The dialog may have up to three buttons. Each of the button | |
2199 parameters, \a button0, \a button1 and \a button2 may be set to | |
2200 one of the following values: | |
2201 | |
2202 \list | |
2203 \o QMessageBox::NoButton | |
2204 \o QMessageBox::Ok | |
2205 \o QMessageBox::Cancel | |
2206 \o QMessageBox::Yes | |
2207 \o QMessageBox::No | |
2208 \o QMessageBox::Abort | |
2209 \o QMessageBox::Retry | |
2210 \o QMessageBox::Ignore | |
2211 \o QMessageBox::YesAll | |
2212 \o QMessageBox::NoAll | |
2213 \endlist | |
2214 | |
2215 If you don't want all three buttons, set the last button, or last | |
2216 two buttons to QMessageBox::NoButton. | |
2217 | |
2218 One button can be OR-ed with QMessageBox::Default, and one | |
2219 button can be OR-ed with QMessageBox::Escape. | |
2220 | |
2221 Returns the identity (QMessageBox::Ok or QMessageBox::No or ...) | |
2222 of the button that was clicked. | |
2223 | |
2224 The message box is an \l{Qt::ApplicationModal} {application modal} | |
2225 dialog box. | |
2226 | |
2227 \warning Do not delete \a parent during the execution of the dialog. | |
2228 If you want to do this, you should create the dialog | |
2229 yourself using one of the QMessageBox constructors. | |
2230 | |
2231 \sa information(), question(), critical() | |
2232 */ | |
2233 int QMessageBox::warning(QWidget *parent, const QString &title, const QString& text, | |
2234 int button0, int button1, int button2) | |
2235 { | |
2236 return QMessageBoxPrivate::showOldMessageBox(parent, Warning, title, text, | |
2237 button0, button1, button2); | |
2238 } | |
2239 | |
2240 /*! | |
2241 \obsolete | |
2242 \overload | |
2243 | |
2244 Displays a warning message box with the given \a title and \a | |
2245 text, as well as one, two, or three buttons. Returns the number | |
2246 of the button that was clicked (0, 1, or 2). | |
2247 | |
2248 \a button0Text is the text of the first button, and is optional. | |
2249 If \a button0Text is not supplied, "OK" (translated) will be used. | |
2250 \a button1Text is the text of the second button, and is optional, | |
2251 and \a button2Text is the text of the third button, and is | |
2252 optional. \a defaultButtonNumber (0, 1 or 2) is the index of the | |
2253 default button; pressing Return or Enter is the same as clicking | |
2254 the default button. It defaults to 0 (the first button). \a | |
2255 escapeButtonNumber is the index of the Escape button; pressing | |
2256 Escape is the same as clicking this button. It defaults to -1; | |
2257 supply 0, 1, or 2 to make pressing Escape equivalent to clicking | |
2258 the relevant button. | |
2259 | |
2260 The message box is an \l{Qt::ApplicationModal} {application modal} | |
2261 dialog box. | |
2262 | |
2263 \warning Do not delete \a parent during the execution of the dialog. | |
2264 If you want to do this, you should create the dialog | |
2265 yourself using one of the QMessageBox constructors. | |
2266 | |
2267 \sa information(), question(), critical() | |
2268 */ | |
2269 int QMessageBox::warning(QWidget *parent, const QString &title, const QString& text, | |
2270 const QString& button0Text, const QString& button1Text, | |
2271 const QString& button2Text, int defaultButtonNumber, | |
2272 int escapeButtonNumber) | |
2273 { | |
2274 return QMessageBoxPrivate::showOldMessageBox(parent, Warning, title, text, | |
2275 button0Text, button1Text, button2Text, | |
2276 defaultButtonNumber, escapeButtonNumber); | |
2277 } | |
2278 | |
2279 /*! | |
2280 \obsolete | |
2281 | |
2282 Opens a critical message box with the given \a title and \a text. | |
2283 The dialog may have up to three buttons. Each of the button | |
2284 parameters, \a button0, \a button1 and \a button2 may be set to | |
2285 one of the following values: | |
2286 | |
2287 \list | |
2288 \o QMessageBox::NoButton | |
2289 \o QMessageBox::Ok | |
2290 \o QMessageBox::Cancel | |
2291 \o QMessageBox::Yes | |
2292 \o QMessageBox::No | |
2293 \o QMessageBox::Abort | |
2294 \o QMessageBox::Retry | |
2295 \o QMessageBox::Ignore | |
2296 \o QMessageBox::YesAll | |
2297 \o QMessageBox::NoAll | |
2298 \endlist | |
2299 | |
2300 If you don't want all three buttons, set the last button, or last | |
2301 two buttons to QMessageBox::NoButton. | |
2302 | |
2303 One button can be OR-ed with QMessageBox::Default, and one | |
2304 button can be OR-ed with QMessageBox::Escape. | |
2305 | |
2306 Returns the identity (QMessageBox::Ok, or QMessageBox::No, etc.) | |
2307 of the button that was clicked. | |
2308 | |
2309 The message box is an \l{Qt::ApplicationModal} {application modal} | |
2310 dialog box. | |
2311 | |
2312 \warning Do not delete \a parent during the execution of the dialog. | |
2313 If you want to do this, you should create the dialog | |
2314 yourself using one of the QMessageBox constructors. | |
2315 | |
2316 \sa information(), question(), warning() | |
2317 */ | |
2318 | |
2319 int QMessageBox::critical(QWidget *parent, const QString &title, const QString& text, | |
2320 int button0, int button1, int button2) | |
2321 { | |
2322 return QMessageBoxPrivate::showOldMessageBox(parent, Critical, title, text, | |
2323 button0, button1, button2); | |
2324 } | |
2325 | |
2326 /*! | |
2327 \obsolete | |
2328 \overload | |
2329 | |
2330 Displays a critical error message box with the given \a title and | |
2331 \a text, as well as one, two, or three buttons. Returns the | |
2332 number of the button that was clicked (0, 1 or 2). | |
2333 | |
2334 \a button0Text is the text of the first button, and is optional. | |
2335 If \a button0Text is not supplied, "OK" (translated) will be used. | |
2336 \a button1Text is the text of the second button, and is optional, | |
2337 and \a button2Text is the text of the third button, and is | |
2338 optional. \a defaultButtonNumber (0, 1 or 2) is the index of the | |
2339 default button; pressing Return or Enter is the same as clicking | |
2340 the default button. It defaults to 0 (the first button). \a | |
2341 escapeButtonNumber is the index of the Escape button; pressing | |
2342 Escape is the same as clicking this button. It defaults to -1; | |
2343 supply 0, 1, or 2 to make pressing Escape equivalent to clicking | |
2344 the relevant button. | |
2345 | |
2346 The message box is an \l{Qt::ApplicationModal} {application modal} | |
2347 dialog box. | |
2348 | |
2349 \warning Do not delete \a parent during the execution of the dialog. | |
2350 If you want to do this, you should create the dialog | |
2351 yourself using one of the QMessageBox constructors. | |
2352 | |
2353 \sa information(), question(), warning() | |
2354 */ | |
2355 int QMessageBox::critical(QWidget *parent, const QString &title, const QString& text, | |
2356 const QString& button0Text, const QString& button1Text, | |
2357 const QString& button2Text, int defaultButtonNumber, | |
2358 int escapeButtonNumber) | |
2359 { | |
2360 return QMessageBoxPrivate::showOldMessageBox(parent, Critical, title, text, | |
2361 button0Text, button1Text, button2Text, | |
2362 defaultButtonNumber, escapeButtonNumber); | |
2363 } | |
2364 | |
2365 | |
2366 /*! | |
2367 \obsolete | |
2368 | |
2369 Returns the text of the message box button \a button, or | |
2370 an empty string if the message box does not contain the button. | |
2371 | |
2372 Use button() and QPushButton::text() instead. | |
2373 */ | |
2374 QString QMessageBox::buttonText(int button) const | |
2375 { | |
2376 Q_D(const QMessageBox); | |
2377 | |
2378 if (QAbstractButton *abstractButton = d->abstractButtonForId(button)) { | |
2379 return abstractButton->text(); | |
2380 } else if (d->buttonBox->buttons().isEmpty() && (button == Ok || button == Old_Ok)) { | |
2381 // for compatibility with Qt 4.0/4.1 | |
2382 return QDialogButtonBox::tr("OK"); | |
2383 } | |
2384 return QString(); | |
2385 } | |
2386 | |
2387 /*! | |
2388 \obsolete | |
2389 | |
2390 Sets the text of the message box button \a button to \a text. | |
2391 Setting the text of a button that is not in the message box is | |
2392 silently ignored. | |
2393 | |
2394 Use addButton() instead. | |
2395 */ | |
2396 void QMessageBox::setButtonText(int button, const QString &text) | |
2397 { | |
2398 Q_D(QMessageBox); | |
2399 if (QAbstractButton *abstractButton = d->abstractButtonForId(button)) { | |
2400 abstractButton->setText(text); | |
2401 } else if (d->buttonBox->buttons().isEmpty() && (button == Ok || button == Old_Ok)) { | |
2402 // for compatibility with Qt 4.0/4.1 | |
2403 addButton(QMessageBox::Ok)->setText(text); | |
2404 } | |
2405 } | |
2406 | |
2407 #ifndef QT_NO_TEXTEDIT | |
2408 /*! | |
2409 \property QMessageBox::detailedText | |
2410 \brief the text to be displayed in the details area. | |
2411 \since 4.2 | |
2412 | |
2413 The text will be interpreted as a plain text. | |
2414 | |
2415 By default, this property contains an empty string. | |
2416 | |
2417 \sa QMessageBox::text, QMessageBox::informativeText | |
2418 */ | |
2419 QString QMessageBox::detailedText() const | |
2420 { | |
2421 Q_D(const QMessageBox); | |
2422 return d->detailsText ? d->detailsText->text() : QString(); | |
2423 } | |
2424 | |
2425 void QMessageBox::setDetailedText(const QString &text) | |
2426 { | |
2427 Q_D(QMessageBox); | |
2428 if (text.isEmpty()) { | |
2429 delete d->detailsText; | |
2430 d->detailsText = 0; | |
2431 removeButton(d->detailsButton); | |
2432 delete d->detailsButton; | |
2433 d->detailsButton = 0; | |
2434 return; | |
2435 } | |
2436 | |
2437 if (!d->detailsText) { | |
2438 d->detailsText = new QMessageBoxDetailsText(this); | |
2439 QGridLayout* grid = qobject_cast<QGridLayout*>(layout()); | |
2440 if (grid) | |
2441 grid->addWidget(d->detailsText, grid->rowCount(), 0, 1, grid->columnCount()); | |
2442 d->detailsText->hide(); | |
2443 } | |
2444 if (!d->detailsButton) | |
2445 d->detailsButton = new DetailButton(this); | |
2446 d->detailsText->setText(text); | |
2447 } | |
2448 #endif // QT_NO_TEXTEDIT | |
2449 | |
2450 /*! | |
2451 \property QMessageBox::informativeText | |
2452 | |
2453 \brief the informative text that provides a fuller description for | |
2454 the message | |
2455 | |
2456 \since 4.2 | |
2457 | |
2458 Infromative text can be used to expand upon the text() to give more | |
2459 information to the user. On the Mac, this text appears in small | |
2460 system font below the text(). On other platforms, it is simply | |
2461 appended to the existing text. | |
2462 | |
2463 By default, this property contains an empty string. | |
2464 | |
2465 \sa QMessageBox::text, QMessageBox::detailedText | |
2466 */ | |
2467 QString QMessageBox::informativeText() const | |
2468 { | |
2469 Q_D(const QMessageBox); | |
2470 return d->informativeLabel ? d->informativeLabel->text() : QString(); | |
2471 } | |
2472 | |
2473 void QMessageBox::setInformativeText(const QString &text) | |
2474 { | |
2475 Q_D(QMessageBox); | |
2476 if (text.isEmpty()) { | |
2477 layout()->removeWidget(d->informativeLabel); | |
2478 delete d->informativeLabel; | |
2479 d->informativeLabel = 0; | |
2480 #ifndef Q_WS_MAC | |
2481 d->label->setContentsMargins(2, 0, 0, 0); | |
2482 #endif | |
2483 d->updateSize(); | |
2484 return; | |
2485 } | |
2486 | |
2487 if (!d->informativeLabel) { | |
2488 QLabel *label = new QLabel(this); | |
2489 label->setObjectName(QLatin1String("qt_msgbox_informativelabel")); | |
2490 label->setTextInteractionFlags(Qt::TextInteractionFlags(style()->styleHint(QStyle::SH_MessageBox_TextInteractionFlags, 0, this))); | |
2491 label->setAlignment(Qt::AlignTop | Qt::AlignLeft); | |
2492 label->setOpenExternalLinks(true); | |
2493 label->setWordWrap(true); | |
2494 #ifndef Q_WS_MAC | |
2495 d->label->setContentsMargins(2, 0, 0, 0); | |
2496 label->setContentsMargins(2, 0, 0, 6); | |
2497 label->setIndent(9); | |
2498 #else | |
2499 label->setContentsMargins(16, 0, 0, 0); | |
2500 // apply a smaller font the information label on the mac | |
2501 label->setFont(qt_app_fonts_hash()->value("QTipLabel")); | |
2502 #endif | |
2503 label->setWordWrap(true); | |
2504 QGridLayout *grid = static_cast<QGridLayout *>(layout()); | |
2505 #if defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5) | |
2506 label->hide(); | |
2507 QTextBrowser *textBrowser = new QTextBrowser(this); | |
2508 textBrowser->setOpenExternalLinks(true); | |
2509 #if defined(Q_OS_SYMBIAN) | |
2510 const int preferredTextColumn = (QApplication::layoutDirection() == Qt::LeftToRight) ? 0 : 1; | |
2511 #else | |
2512 const int preferredTextColumn = 1; | |
2513 #endif | |
2514 grid->addWidget(textBrowser, 1, preferredTextColumn, 1, 1); | |
2515 d->textBrowser = textBrowser; | |
2516 #else | |
2517 grid->addWidget(label, 1, 1, 1, 1); | |
2518 #endif | |
2519 d->informativeLabel = label; | |
2520 } | |
2521 d->informativeLabel->setText(text); | |
2522 | |
2523 #if defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5) | |
2524 //We need to put the informative label inside textBrowser to enable scrolling of long texts. | |
2525 d->textBrowser->setText(d->informativeLabel->text()); | |
2526 #endif | |
2527 | |
2528 d->updateSize(); | |
2529 } | |
2530 | |
2531 /*! | |
2532 \since 4.2 | |
2533 | |
2534 This function shadows QWidget::setWindowTitle(). | |
2535 | |
2536 Sets the title of the message box to \a title. On Mac OS X, | |
2537 the window title is ignored (as required by the Mac OS X | |
2538 Guidelines). | |
2539 */ | |
2540 void QMessageBox::setWindowTitle(const QString &title) | |
2541 { | |
2542 // Message boxes on the mac do not have a title | |
2543 #ifndef Q_WS_MAC | |
2544 QDialog::setWindowTitle(title); | |
2545 #else | |
2546 Q_UNUSED(title); | |
2547 #endif | |
2548 } | |
2549 | |
2550 | |
2551 /*! | |
2552 \since 4.2 | |
2553 | |
2554 This function shadows QWidget::setWindowModality(). | |
2555 | |
2556 Sets the modality of the message box to \a windowModality. | |
2557 | |
2558 On Mac OS X, if the modality is set to Qt::WindowModal and the message box | |
2559 has a parent, then the message box will be a Qt::Sheet, otherwise the | |
2560 message box will be a standard dialog. | |
2561 */ | |
2562 void QMessageBox::setWindowModality(Qt::WindowModality windowModality) | |
2563 { | |
2564 QDialog::setWindowModality(windowModality); | |
2565 | |
2566 if (parentWidget() && windowModality == Qt::WindowModal) | |
2567 setParent(parentWidget(), Qt::Sheet); | |
2568 else | |
2569 setParent(parentWidget(), Qt::Dialog); | |
2570 setDefaultButton(d_func()->defaultButton); | |
2571 } | |
2572 | |
2573 #ifdef QT3_SUPPORT | |
2574 /*! | |
2575 \compat | |
2576 | |
2577 Constructs a message box with the given \a parent, \a name, and | |
2578 window flags, \a f. | |
2579 The window title is specified by \a title, and the message box | |
2580 displays message text and an icon specified by \a text and \a icon. | |
2581 | |
2582 The buttons that the user can access to respond to the message are | |
2583 defined by \a button0, \a button1, and \a button2. | |
2584 */ | |
2585 QMessageBox::QMessageBox(const QString& title, | |
2586 const QString &text, Icon icon, | |
2587 int button0, int button1, int button2, | |
2588 QWidget *parent, const char *name, | |
2589 bool modal, Qt::WindowFlags f) | |
2590 : QDialog(*new QMessageBoxPrivate, parent, | |
2591 f | Qt::WStyle_Customize | Qt::WStyle_DialogBorder | Qt::WStyle_Title | Qt::WStyle_SysMenu | Qt::WindowCloseButtonHint) | |
2592 { | |
2593 Q_D(QMessageBox); | |
2594 setObjectName(QString::fromAscii(name)); | |
2595 d->init(title, text); | |
2596 d->addOldButtons(button0, button1, button2); | |
2597 setModal(modal); | |
2598 setIcon(icon); | |
2599 } | |
2600 | |
2601 /*! | |
2602 \compat | |
2603 Constructs a message box with the given \a parent and \a name. | |
2604 */ | |
2605 QMessageBox::QMessageBox(QWidget *parent, const char *name) | |
2606 : QDialog(*new QMessageBoxPrivate, parent, | |
2607 Qt::WStyle_Customize | Qt::WStyle_DialogBorder | Qt::WStyle_Title | Qt::WStyle_SysMenu | Qt::WindowCloseButtonHint) | |
2608 { | |
2609 Q_D(QMessageBox); | |
2610 setObjectName(QString::fromAscii(name)); | |
2611 d->init(); | |
2612 } | |
2613 | |
2614 /*! | |
2615 Returns the pixmap used for a standard icon. This | |
2616 allows the pixmaps to be used in more complex message boxes. | |
2617 \a icon specifies the required icon, e.g. QMessageBox::Information, | |
2618 QMessageBox::Warning or QMessageBox::Critical. | |
2619 | |
2620 \a style is unused. | |
2621 */ | |
2622 | |
2623 QPixmap QMessageBox::standardIcon(Icon icon, Qt::GUIStyle style) | |
2624 { | |
2625 Q_UNUSED(style); | |
2626 return QMessageBox::standardIcon(icon); | |
2627 } | |
2628 | |
2629 /*! | |
2630 \fn int QMessageBox::message(const QString &title, const QString &text, | |
2631 const QString &buttonText, QWidget *parent = 0, | |
2632 const char *name = 0) | |
2633 | |
2634 Opens a modal message box with the given \a title and showing the | |
2635 given \a text. The message box has a single button which has the | |
2636 given \a buttonText (or tr("OK")). The message box is centred over | |
2637 its \a parent and is called \a name. | |
2638 | |
2639 Use information(), warning(), question(), or critical() instead. | |
2640 | |
2641 \oldcode | |
2642 QMessageBox::message(tr("My App"), tr("All occurrences replaced."), | |
2643 tr("Close"), this); | |
2644 \newcode | |
2645 QMessageBox::information(this, tr("My App"), | |
2646 tr("All occurrences replaced."), | |
2647 QMessageBox::Close); | |
2648 \endcode | |
2649 */ | |
2650 | |
2651 /*! | |
2652 \fn bool QMessageBox::query(const QString &caption, | |
2653 const QString& text, | |
2654 const QString& yesButtonText, | |
2655 const QString& noButtonText, | |
2656 QWidget *parent, const char *name) | |
2657 | |
2658 \obsolete | |
2659 | |
2660 Queries the user using a modal message box with up to two buttons. | |
2661 The message box has the given \a caption (although some window | |
2662 managers don't show it), and shows the given \a text. The left | |
2663 button has the \a yesButtonText (or tr("OK")), and the right button | |
2664 has the \a noButtonText (or isn't shown). The message box is centred | |
2665 over its \a parent and is called \a name. | |
2666 | |
2667 Use information(), question(), warning(), or critical() instead. | |
2668 */ | |
2669 | |
2670 #endif | |
2671 | |
2672 QPixmap QMessageBoxPrivate::standardIcon(QMessageBox::Icon icon, QMessageBox *mb) | |
2673 { | |
2674 QStyle *style = mb ? mb->style() : QApplication::style(); | |
2675 int iconSize = style->pixelMetric(QStyle::PM_MessageBoxIconSize, 0, mb); | |
2676 QIcon tmpIcon; | |
2677 switch (icon) { | |
2678 case QMessageBox::Information: | |
2679 tmpIcon = style->standardIcon(QStyle::SP_MessageBoxInformation, 0, mb); | |
2680 break; | |
2681 case QMessageBox::Warning: | |
2682 tmpIcon = style->standardIcon(QStyle::SP_MessageBoxWarning, 0, mb); | |
2683 break; | |
2684 case QMessageBox::Critical: | |
2685 tmpIcon = style->standardIcon(QStyle::SP_MessageBoxCritical, 0, mb); | |
2686 break; | |
2687 case QMessageBox::Question: | |
2688 tmpIcon = style->standardIcon(QStyle::SP_MessageBoxQuestion, 0, mb); | |
2689 default: | |
2690 break; | |
2691 } | |
2692 if (!tmpIcon.isNull()) | |
2693 return tmpIcon.pixmap(iconSize, iconSize); | |
2694 return QPixmap(); | |
2695 } | |
2696 | |
2697 /*! | |
2698 \obsolete | |
2699 | |
2700 Returns the pixmap used for a standard icon. This allows the | |
2701 pixmaps to be used in more complex message boxes. \a icon | |
2702 specifies the required icon, e.g. QMessageBox::Question, | |
2703 QMessageBox::Information, QMessageBox::Warning or | |
2704 QMessageBox::Critical. | |
2705 | |
2706 Call QStyle::standardIcon() with QStyle::SP_MessageBoxInformation etc. | |
2707 instead. | |
2708 */ | |
2709 | |
2710 QPixmap QMessageBox::standardIcon(Icon icon) | |
2711 { | |
2712 return QMessageBoxPrivate::standardIcon(icon, 0); | |
2713 } | |
2714 | |
2715 /*! | |
2716 \typedef QMessageBox::Button | |
2717 \obsolete | |
2718 | |
2719 Use QMessageBox::StandardButton instead. | |
2720 */ | |
2721 | |
2722 /*! | |
2723 \fn int QMessageBox::information(QWidget *parent, const QString &title, | |
2724 const QString& text, StandardButton button0, | |
2725 StandardButton button1) | |
2726 \fn int QMessageBox::warning(QWidget *parent, const QString &title, | |
2727 const QString& text, StandardButton button0, | |
2728 StandardButton button1) | |
2729 \fn int QMessageBox::critical(QWidget *parent, const QString &title, | |
2730 const QString& text, StandardButton button0, | |
2731 StandardButton button1) | |
2732 \fn int QMessageBox::question(QWidget *parent, const QString &title, | |
2733 const QString& text, StandardButton button0, | |
2734 StandardButton button1) | |
2735 \internal | |
2736 | |
2737 ### Needed for Qt 4 source compatibility | |
2738 */ | |
2739 | |
2740 /*! | |
2741 \fn int QMessageBox::exec() | |
2742 | |
2743 Shows the message box as a \l{QDialog#Modal Dialogs}{modal dialog}, | |
2744 blocking until the user closes it. | |
2745 | |
2746 When using a QMessageBox with standard buttons, this functions returns a | |
2747 \l StandardButton value indicating the standard button that was clicked. | |
2748 When using QMessageBox with custom buttons, this function returns an | |
2749 opaque value; use clickedButton() to determine which button was clicked. | |
2750 | |
2751 \note The result() function returns also \l StandardButton value instead of \l QDialog::DialogCode | |
2752 | |
2753 Users cannot interact with any other window in the same | |
2754 application until they close the dialog, either by clicking a | |
2755 button or by using a mechanism provided by the window system. | |
2756 | |
2757 \sa show(), result() | |
2758 */ | |
2759 | |
2760 QT_END_NAMESPACE | |
2761 | |
2762 #include "moc_qmessagebox.cpp" | |
2763 | |
2764 #endif // QT_NO_MESSAGEBOX |