source: trunk/src/gui/widgets/qsplashscreen.cpp@ 754

Last change on this file since 754 was 651, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.2 sources.

File size: 10.1 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtGui module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "qsplashscreen.h"
43
44#ifndef QT_NO_SPLASHSCREEN
45
46#include "qapplication.h"
47#include "qdesktopwidget.h"
48#include "qpainter.h"
49#include "qpixmap.h"
50#include "qtextdocument.h"
51#include "qtextcursor.h"
52#include <QtCore/qdebug.h>
53#include <private/qwidget_p.h>
54
55QT_BEGIN_NAMESPACE
56
57class QSplashScreenPrivate : public QWidgetPrivate
58{
59 Q_DECLARE_PUBLIC(QSplashScreen)
60public:
61 QPixmap pixmap;
62 QString currStatus;
63 QColor currColor;
64 int currAlign;
65
66 inline QSplashScreenPrivate();
67 void drawContents();
68};
69
70/*!
71 \class QSplashScreen
72 \brief The QSplashScreen widget provides a splash screen that can
73 be shown during application startup.
74
75 A splash screen is a widget that is usually displayed when an
76 application is being started. Splash screens are often used for
77 applications that have long start up times (e.g. database or
78 networking applications that take time to establish connections) to
79 provide the user with feedback that the application is loading.
80
81 The splash screen appears in the center of the screen. It may be
82 useful to add the Qt::WindowStaysOnTopHint to the splash widget's
83 window flags if you want to keep it above all the other windows on
84 the desktop.
85
86 Some X11 window managers do not support the "stays on top" flag. A
87 solution is to set up a timer that periodically calls raise() on
88 the splash screen to simulate the "stays on top" effect.
89
90 The most common usage is to show a splash screen before the main
91 widget is displayed on the screen. This is illustrated in the
92 following code snippet in which a splash screen is displayed and
93 some initialization tasks are performed before the application's
94 main window is shown:
95
96 \snippet doc/src/snippets/qsplashscreen/main.cpp 0
97 \dots
98 \snippet doc/src/snippets/qsplashscreen/main.cpp 1
99
100 The user can hide the splash screen by clicking on it with the
101 mouse. Since the splash screen is typically displayed before the
102 event loop has started running, it is necessary to periodically
103 call QApplication::processEvents() to receive the mouse clicks.
104
105 It is sometimes useful to update the splash screen with messages,
106 for example, announcing connections established or modules loaded
107 as the application starts up:
108
109 \snippet doc/src/snippets/code/src_gui_widgets_qsplashscreen.cpp 0
110
111 QSplashScreen supports this with the showMessage() function. If you
112 wish to do your own drawing you can get a pointer to the pixmap
113 used in the splash screen with pixmap(). Alternatively, you can
114 subclass QSplashScreen and reimplement drawContents().
115*/
116
117/*!
118 Construct a splash screen that will display the \a pixmap.
119
120 There should be no need to set the widget flags, \a f, except
121 perhaps Qt::WindowStaysOnTopHint.
122*/
123QSplashScreen::QSplashScreen(const QPixmap &pixmap, Qt::WindowFlags f)
124 : QWidget(*(new QSplashScreenPrivate()), 0, Qt::SplashScreen | f)
125{
126 d_func()->pixmap = pixmap;
127 setPixmap(d_func()->pixmap); // Does an implicit repaint
128}
129
130/*!
131 \overload
132
133 This function allows you to specify a parent for your splashscreen. The
134 typical use for this constructor is if you have a multiple screens and
135 prefer to have the splash screen on a different screen than your primary
136 one. In that case pass the proper desktop() as the \a parent.
137*/
138QSplashScreen::QSplashScreen(QWidget *parent, const QPixmap &pixmap, Qt::WindowFlags f)
139 : QWidget(*new QSplashScreenPrivate, parent, Qt::SplashScreen | f)
140{
141 d_func()->pixmap = pixmap;
142 setPixmap(d_func()->pixmap); // Does an implicit repaint
143}
144
145/*!
146 Destructor.
147*/
148QSplashScreen::~QSplashScreen()
149{
150}
151
152/*!
153 \reimp
154*/
155void QSplashScreen::mousePressEvent(QMouseEvent *)
156{
157 hide();
158}
159
160/*!
161 This overrides QWidget::repaint(). It differs from the standard
162 repaint function in that it also calls QApplication::flush() to
163 ensure the updates are displayed, even when there is no event loop
164 present.
165*/
166void QSplashScreen::repaint()
167{
168 d_func()->drawContents();
169 QWidget::repaint();
170 QApplication::flush();
171}
172
173/*!
174 \fn QSplashScreen::messageChanged(const QString &message)
175
176 This signal is emitted when the message on the splash screen
177 changes. \a message is the new message and is a null-string
178 when the message has been removed.
179
180 \sa showMessage(), clearMessage()
181*/
182
183
184
185/*!
186 Draws the \a message text onto the splash screen with color \a
187 color and aligns the text according to the flags in \a alignment.
188
189 \sa Qt::Alignment, clearMessage()
190*/
191void QSplashScreen::showMessage(const QString &message, int alignment,
192 const QColor &color)
193{
194 Q_D(QSplashScreen);
195 d->currStatus = message;
196 d->currAlign = alignment;
197 d->currColor = color;
198 emit messageChanged(d->currStatus);
199 repaint();
200}
201
202/*!
203 Removes the message being displayed on the splash screen
204
205 \sa showMessage()
206 */
207void QSplashScreen::clearMessage()
208{
209 d_func()->currStatus.clear();
210 emit messageChanged(d_func()->currStatus);
211 repaint();
212}
213
214/*!
215 Makes the splash screen wait until the widget \a mainWin is displayed
216 before calling close() on itself.
217*/
218void QSplashScreen::finish(QWidget *mainWin)
219{
220 if (mainWin) {
221#if defined(Q_WS_X11)
222 extern void qt_x11_wait_for_window_manager(QWidget *mainWin);
223 qt_x11_wait_for_window_manager(mainWin);
224#endif
225 }
226 close();
227}
228
229/*!
230 Sets the pixmap that will be used as the splash screen's image to
231 \a pixmap.
232*/
233void QSplashScreen::setPixmap(const QPixmap &pixmap)
234{
235 Q_D(QSplashScreen);
236
237 if (pixmap.hasAlpha()) {
238 QPixmap opaque(pixmap.size());
239 QPainter p(&opaque);
240 p.fillRect(0, 0, pixmap.width(), pixmap.height(), palette().background());
241 p.drawPixmap(0, 0, pixmap);
242 p.end();
243 d->pixmap = opaque;
244 } else {
245 d->pixmap = pixmap;
246 }
247
248 QRect r(0, 0, d->pixmap.size().width(), d->pixmap.size().height());
249 resize(d->pixmap.size());
250 move(QApplication::desktop()->screenGeometry().center() - r.center());
251 if (!isVisible())
252 d->drawContents();
253 else
254 repaint();
255}
256
257/*!
258 Returns the pixmap that is used in the splash screen. The image
259 does not have any of the text drawn by showMessage() calls.
260*/
261const QPixmap QSplashScreen::pixmap() const
262{
263 return d_func()->pixmap;
264}
265
266/*!
267 \internal
268*/
269void QSplashScreenPrivate::drawContents()
270{
271 Q_Q(QSplashScreen);
272 QPixmap textPix = pixmap;
273 if (!textPix.isNull()) {
274 QPainter painter(&textPix);
275 painter.initFrom(q);
276 q->drawContents(&painter);
277 QPalette p = q->palette();
278 p.setBrush(q->backgroundRole(), QBrush(textPix));
279 q->setPalette(p);
280 }
281}
282
283/*!
284 \internal
285*/
286inline QSplashScreenPrivate::QSplashScreenPrivate() : currAlign(Qt::AlignLeft)
287{
288}
289
290/*!
291 Draw the contents of the splash screen using painter \a painter.
292 The default implementation draws the message passed by showMessage().
293 Reimplement this function if you want to do your own drawing on
294 the splash screen.
295*/
296void QSplashScreen::drawContents(QPainter *painter)
297{
298 Q_D(QSplashScreen);
299 painter->setPen(d->currColor);
300 QRect r = rect();
301 r.setRect(r.x() + 5, r.y() + 5, r.width() - 10, r.height() - 10);
302 if (Qt::mightBeRichText(d->currStatus)) {
303 QTextDocument doc;
304#ifdef QT_NO_TEXTHTMLPARSER
305 doc.setPlainText(d->currStatus);
306#else
307 doc.setHtml(d->currStatus);
308#endif
309 doc.setTextWidth(r.width());
310 QTextCursor cursor(&doc);
311 cursor.select(QTextCursor::Document);
312 QTextBlockFormat fmt;
313 fmt.setAlignment(Qt::Alignment(d->currAlign));
314 cursor.mergeBlockFormat(fmt);
315 painter->save();
316 painter->translate(r.topLeft());
317 doc.drawContents(painter);
318 painter->restore();
319 } else {
320 painter->drawText(r, d->currAlign, d->currStatus);
321 }
322}
323
324/*!
325 \fn void QSplashScreen::message(const QString &message, int alignment,
326 const QColor &color)
327 \compat
328
329 Use showMessage() instead.
330*/
331
332/*!
333 \fn void QSplashScreen::clear()
334 \compat
335
336 Use clearMessage() instead.
337*/
338
339/*! \reimp */
340bool QSplashScreen::event(QEvent *e)
341{
342 return QWidget::event(e);
343}
344
345QT_END_NAMESPACE
346
347#endif //QT_NO_SPLASHSCREEN
Note: See TracBrowser for help on using the repository browser.