1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt Quick Dialogs 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 https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://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 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#ifndef QMESSAGEBOXHELPER_P_H
41#define QMESSAGEBOXHELPER_P_H
42
43//
44// W A R N I N G
45// -------------
46//
47// This file is not part of the Qt API. It exists purely as an
48// implementation detail. This header file may change from version to
49// version without notice, or even be removed.
50//
51// We mean it.
52//
53
54#include <QMessageBox>
55#include "../dialogs/qquickabstractmessagedialog_p.h"
56
57QT_BEGIN_NAMESPACE
58
59class QCloseableMessageBox : public QMessageBox
60{
61public:
62 QCloseableMessageBox(QWidget *parent = 0) : QMessageBox(parent) { }
63
64 void closeEvent(QCloseEvent *e) override {
65 // QTBUG-36227: Bypass QMessageBox::closeEvent()
66 QDialog::closeEvent(e);
67 }
68
69 void keyPressEvent(QKeyEvent *e) override {
70 QMessageBox::keyPressEvent(event: e);
71 // QTBUG-36227: reject on escape or cmd-period even if there's no cancel button
72 if ((isVisible() && e->key() == Qt::Key_Escape)
73#ifdef Q_OS_MAC
74 || (e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Period)
75#endif
76 )
77 reject();
78 }
79};
80
81class QMessageBoxHelper : public QPlatformMessageDialogHelper
82{
83 Q_OBJECT
84public:
85 QMessageBoxHelper() {
86 connect(sender: &m_dialog, SIGNAL(accepted()), receiver: this, SIGNAL(accept()));
87 connect(sender: &m_dialog, SIGNAL(rejected()), receiver: this, SIGNAL(reject()));
88 connect(sender: &m_dialog, SIGNAL(buttonClicked(QAbstractButton*)), receiver: this, SLOT(buttonClicked(QAbstractButton*)));
89 }
90
91 void exec() override { m_dialog.exec(); }
92
93 bool show(Qt::WindowFlags f, Qt::WindowModality m, QWindow *parent) override {
94 m_dialog.winId();
95 QWindow *window = m_dialog.windowHandle();
96 Q_ASSERT(window);
97 window->setTransientParent(parent);
98 window->setFlags(f);
99 m_dialog.setWindowModality(m);
100 m_dialog.setWindowTitle(QPlatformMessageDialogHelper::options()->windowTitle());
101 m_dialog.setIcon(static_cast<QMessageBox::Icon>(QPlatformMessageDialogHelper::options()->icon()));
102 if (!QPlatformMessageDialogHelper::options()->text().isNull())
103 m_dialog.setText(QPlatformMessageDialogHelper::options()->text());
104 if (!QPlatformMessageDialogHelper::options()->informativeText().isNull())
105 m_dialog.setInformativeText(QPlatformMessageDialogHelper::options()->informativeText());
106#if QT_CONFIG(textedit)
107 if (!QPlatformMessageDialogHelper::options()->detailedText().isNull())
108 m_dialog.setDetailedText(QPlatformMessageDialogHelper::options()->detailedText());
109#endif
110 m_dialog.setStandardButtons(static_cast<QMessageBox::StandardButtons>(static_cast<int>(
111 QPlatformMessageDialogHelper::options()->standardButtons())));
112 m_dialog.show();
113 return m_dialog.isVisible();
114 }
115
116 void hide() override { m_dialog.hide(); }
117
118 QCloseableMessageBox m_dialog;
119
120public Q_SLOTS:
121 void buttonClicked(QAbstractButton* button) {
122 emit clicked(button: static_cast<QPlatformDialogHelper::StandardButton>(m_dialog.standardButton(button)),
123 role: static_cast<QPlatformDialogHelper::ButtonRole>(m_dialog.buttonRole(button)));
124 }
125};
126
127QT_END_NAMESPACE
128
129#endif // QMESSAGEBOXHELPER_P_H
130

source code of qtquickcontrols/src/widgets/qmessageboxhelper_p.h