Analog clock and raster window examples
Change-Id: I36586fbaa7da25208bbc1964d2708f094d0d5c98 Reviewed-by: Gunnar Sletta <gunnar.sletta@nokia.com>
This commit is contained in:
parent
d472db2412
commit
c97104f31e
4
examples/gui/analogclock/analogclock.pro
Normal file
4
examples/gui/analogclock/analogclock.pro
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
include(../rasterwindow/rasterwindow.pri)
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
main.cpp
|
160
examples/gui/analogclock/main.cpp
Normal file
160
examples/gui/analogclock/main.cpp
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
** This file is part of the examples of the Qt Toolkit.
|
||||||
|
**
|
||||||
|
** $QT_BEGIN_LICENSE:BSD$
|
||||||
|
** You may use this file under the terms of the BSD license as follows:
|
||||||
|
**
|
||||||
|
** "Redistribution and use in source and binary forms, with or without
|
||||||
|
** modification, are permitted provided that the following conditions are
|
||||||
|
** met:
|
||||||
|
** * Redistributions of source code must retain the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer.
|
||||||
|
** * Redistributions in binary form must reproduce the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer in
|
||||||
|
** the documentation and/or other materials provided with the
|
||||||
|
** distribution.
|
||||||
|
** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
|
||||||
|
** the names of its contributors may be used to endorse or promote
|
||||||
|
** products derived from this software without specific prior written
|
||||||
|
** permission.
|
||||||
|
**
|
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
#include "rasterwindow.h"
|
||||||
|
|
||||||
|
//! [5]
|
||||||
|
class AnalogClockWindow : public RasterWindow
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AnalogClockWindow();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void timerEvent(QTimerEvent *);
|
||||||
|
void render(QPainter *p);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_timerId;
|
||||||
|
};
|
||||||
|
//! [5]
|
||||||
|
|
||||||
|
|
||||||
|
//! [6]
|
||||||
|
AnalogClockWindow::AnalogClockWindow()
|
||||||
|
{
|
||||||
|
setWindowTitle("Analog Clock");
|
||||||
|
resize(200, 200);
|
||||||
|
|
||||||
|
m_timerId = startTimer(1000);
|
||||||
|
}
|
||||||
|
//! [6]
|
||||||
|
|
||||||
|
//! [7]
|
||||||
|
void AnalogClockWindow::timerEvent(QTimerEvent *event)
|
||||||
|
{
|
||||||
|
if (event->timerId() == m_timerId)
|
||||||
|
renderLater();
|
||||||
|
}
|
||||||
|
//! [7]
|
||||||
|
|
||||||
|
//! [1] //! [14]
|
||||||
|
void AnalogClockWindow::render(QPainter *p)
|
||||||
|
{
|
||||||
|
//! [14]
|
||||||
|
//! [8]
|
||||||
|
static const QPoint hourHand[3] = {
|
||||||
|
QPoint(7, 8),
|
||||||
|
QPoint(-7, 8),
|
||||||
|
QPoint(0, -40)
|
||||||
|
};
|
||||||
|
static const QPoint minuteHand[3] = {
|
||||||
|
QPoint(7, 8),
|
||||||
|
QPoint(-7, 8),
|
||||||
|
QPoint(0, -70)
|
||||||
|
};
|
||||||
|
|
||||||
|
QColor hourColor(127, 0, 127);
|
||||||
|
QColor minuteColor(0, 127, 127, 191);
|
||||||
|
//! [8]
|
||||||
|
|
||||||
|
//! [9]
|
||||||
|
p->setRenderHint(QPainter::Antialiasing);
|
||||||
|
//! [9] //! [10]
|
||||||
|
p->translate(width() / 2, height() / 2);
|
||||||
|
|
||||||
|
int side = qMin(width(), height());
|
||||||
|
p->scale(side / 200.0, side / 200.0);
|
||||||
|
//! [1] //! [10]
|
||||||
|
|
||||||
|
//! [11]
|
||||||
|
p->setPen(Qt::NoPen);
|
||||||
|
p->setBrush(hourColor);
|
||||||
|
//! [11]
|
||||||
|
|
||||||
|
//! [2]
|
||||||
|
QTime time = QTime::currentTime();
|
||||||
|
|
||||||
|
p->save();
|
||||||
|
p->rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
|
||||||
|
p->drawConvexPolygon(hourHand, 3);
|
||||||
|
p->restore();
|
||||||
|
//! [2]
|
||||||
|
|
||||||
|
//! [12]
|
||||||
|
p->setPen(hourColor);
|
||||||
|
|
||||||
|
for (int i = 0; i < 12; ++i) {
|
||||||
|
p->drawLine(88, 0, 96, 0);
|
||||||
|
p->rotate(30.0);
|
||||||
|
}
|
||||||
|
//! [12] //! [13]
|
||||||
|
p->setPen(Qt::NoPen);
|
||||||
|
p->setBrush(minuteColor);
|
||||||
|
//! [13]
|
||||||
|
|
||||||
|
//! [3]
|
||||||
|
p->save();
|
||||||
|
p->rotate(6.0 * (time.minute() + time.second() / 60.0));
|
||||||
|
p->drawConvexPolygon(minuteHand, 3);
|
||||||
|
p->restore();
|
||||||
|
//! [3]
|
||||||
|
|
||||||
|
//! [4]
|
||||||
|
p->setPen(minuteColor);
|
||||||
|
|
||||||
|
for (int j = 0; j < 60; ++j) {
|
||||||
|
if ((j % 5) != 0)
|
||||||
|
p->drawLine(92, 0, 96, 0);
|
||||||
|
p->rotate(6.0);
|
||||||
|
}
|
||||||
|
//! [4]
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
QGuiApplication app(argc, argv);
|
||||||
|
|
||||||
|
AnalogClockWindow clock;
|
||||||
|
clock.show();
|
||||||
|
|
||||||
|
app.exec();
|
||||||
|
}
|
5
examples/gui/gui.pro
Normal file
5
examples/gui/gui.pro
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
TEMPLATE = subdirs
|
||||||
|
|
||||||
|
SUBDIRS += analogclock
|
||||||
|
SUBDIRS += rasterwindow
|
||||||
|
|
53
examples/gui/rasterwindow/main.cpp
Normal file
53
examples/gui/rasterwindow/main.cpp
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
** This file is part of the examples of the Qt Toolkit.
|
||||||
|
**
|
||||||
|
** $QT_BEGIN_LICENSE:BSD$
|
||||||
|
** You may use this file under the terms of the BSD license as follows:
|
||||||
|
**
|
||||||
|
** "Redistribution and use in source and binary forms, with or without
|
||||||
|
** modification, are permitted provided that the following conditions are
|
||||||
|
** met:
|
||||||
|
** * Redistributions of source code must retain the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer.
|
||||||
|
** * Redistributions in binary form must reproduce the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer in
|
||||||
|
** the documentation and/or other materials provided with the
|
||||||
|
** distribution.
|
||||||
|
** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
|
||||||
|
** the names of its contributors may be used to endorse or promote
|
||||||
|
** products derived from this software without specific prior written
|
||||||
|
** permission.
|
||||||
|
**
|
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "rasterwindow.h"
|
||||||
|
|
||||||
|
//! [1]
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
QGuiApplication app(argc, argv);
|
||||||
|
|
||||||
|
RasterWindow window;
|
||||||
|
window.show();
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
||||||
|
//! [1]
|
124
examples/gui/rasterwindow/rasterwindow.cpp
Normal file
124
examples/gui/rasterwindow/rasterwindow.cpp
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
** This file is part of the examples of the Qt Toolkit.
|
||||||
|
**
|
||||||
|
** $QT_BEGIN_LICENSE:BSD$
|
||||||
|
** You may use this file under the terms of the BSD license as follows:
|
||||||
|
**
|
||||||
|
** "Redistribution and use in source and binary forms, with or without
|
||||||
|
** modification, are permitted provided that the following conditions are
|
||||||
|
** met:
|
||||||
|
** * Redistributions of source code must retain the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer.
|
||||||
|
** * Redistributions in binary form must reproduce the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer in
|
||||||
|
** the documentation and/or other materials provided with the
|
||||||
|
** distribution.
|
||||||
|
** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
|
||||||
|
** the names of its contributors may be used to endorse or promote
|
||||||
|
** products derived from this software without specific prior written
|
||||||
|
** permission.
|
||||||
|
**
|
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "rasterwindow.h"
|
||||||
|
|
||||||
|
//! [1]
|
||||||
|
RasterWindow::RasterWindow(QWindow *parent)
|
||||||
|
: QWindow(parent)
|
||||||
|
, m_update_pending(false)
|
||||||
|
{
|
||||||
|
create();
|
||||||
|
|
||||||
|
setGeometry(100, 100, 300, 200);
|
||||||
|
|
||||||
|
m_backingStore = new QBackingStore(this);
|
||||||
|
}
|
||||||
|
//! [1]
|
||||||
|
|
||||||
|
|
||||||
|
//! [7]
|
||||||
|
bool RasterWindow::event(QEvent *event)
|
||||||
|
{
|
||||||
|
if (event->type() == QEvent::UpdateRequest) {
|
||||||
|
m_update_pending = false;
|
||||||
|
renderNow();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return QWindow::event(event);
|
||||||
|
}
|
||||||
|
//! [7]
|
||||||
|
|
||||||
|
//! [6]
|
||||||
|
void RasterWindow::renderLater()
|
||||||
|
{
|
||||||
|
if (!m_update_pending) {
|
||||||
|
m_update_pending = true;
|
||||||
|
QCoreApplication::postEvent(this, new QEvent(QEvent::UpdateRequest));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//! [6]
|
||||||
|
|
||||||
|
|
||||||
|
//! [5]
|
||||||
|
void RasterWindow::resizeEvent(QResizeEvent *resizeEvent)
|
||||||
|
{
|
||||||
|
m_backingStore->resize(resizeEvent->size());
|
||||||
|
if (isExposed())
|
||||||
|
renderNow();
|
||||||
|
}
|
||||||
|
//! [5]
|
||||||
|
|
||||||
|
//! [2]
|
||||||
|
void RasterWindow::exposeEvent(QExposeEvent *)
|
||||||
|
{
|
||||||
|
if (isExposed()) {
|
||||||
|
renderNow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//! [2]
|
||||||
|
|
||||||
|
|
||||||
|
//! [3]
|
||||||
|
void RasterWindow::renderNow()
|
||||||
|
{
|
||||||
|
if (!isExposed())
|
||||||
|
return;
|
||||||
|
|
||||||
|
QRect rect(0, 0, width(), height());
|
||||||
|
m_backingStore->beginPaint(rect);
|
||||||
|
|
||||||
|
QPaintDevice *device = m_backingStore->paintDevice();
|
||||||
|
QPainter painter(device);
|
||||||
|
|
||||||
|
painter.fillRect(0, 0, width(), height(), Qt::white);
|
||||||
|
render(&painter);
|
||||||
|
|
||||||
|
m_backingStore->endPaint();
|
||||||
|
m_backingStore->flush(rect);
|
||||||
|
}
|
||||||
|
//! [3]
|
||||||
|
|
||||||
|
//! [4]
|
||||||
|
void RasterWindow::render(QPainter *painter)
|
||||||
|
{
|
||||||
|
painter->drawText(QRectF(0, 0, width(), height()), Qt::AlignCenter, QStringLiteral("QWindow"));
|
||||||
|
}
|
||||||
|
//! [4]
|
70
examples/gui/rasterwindow/rasterwindow.h
Normal file
70
examples/gui/rasterwindow/rasterwindow.h
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
** This file is part of the examples of the Qt Toolkit.
|
||||||
|
**
|
||||||
|
** $QT_BEGIN_LICENSE:BSD$
|
||||||
|
** You may use this file under the terms of the BSD license as follows:
|
||||||
|
**
|
||||||
|
** "Redistribution and use in source and binary forms, with or without
|
||||||
|
** modification, are permitted provided that the following conditions are
|
||||||
|
** met:
|
||||||
|
** * Redistributions of source code must retain the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer.
|
||||||
|
** * Redistributions in binary form must reproduce the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer in
|
||||||
|
** the documentation and/or other materials provided with the
|
||||||
|
** distribution.
|
||||||
|
** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
|
||||||
|
** the names of its contributors may be used to endorse or promote
|
||||||
|
** products derived from this software without specific prior written
|
||||||
|
** permission.
|
||||||
|
**
|
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef RASTERWINDOW_H
|
||||||
|
#define RASTERWINDOW_H
|
||||||
|
|
||||||
|
//! [1]
|
||||||
|
#include <QtGui>
|
||||||
|
|
||||||
|
class RasterWindow : public QWindow
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit RasterWindow(QWindow *parent = 0);
|
||||||
|
|
||||||
|
virtual void render(QPainter *painter);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void renderLater();
|
||||||
|
void renderNow();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool event(QEvent *event);
|
||||||
|
|
||||||
|
void resizeEvent(QResizeEvent *event);
|
||||||
|
void exposeEvent(QExposeEvent *event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QBackingStore *m_backingStore;
|
||||||
|
bool m_update_pending;
|
||||||
|
};
|
||||||
|
//! [1]
|
||||||
|
#endif // RASTERWINDOW_H
|
3
examples/gui/rasterwindow/rasterwindow.pri
Normal file
3
examples/gui/rasterwindow/rasterwindow.pri
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
INCLUDEPATH += $$PWD
|
||||||
|
SOURCES += $$PWD/rasterwindow.cpp
|
||||||
|
HEADERS += $$PWD/rasterwindow.h
|
7
examples/gui/rasterwindow/rasterwindow.pro
Normal file
7
examples/gui/rasterwindow/rasterwindow.pro
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
include(rasterwindow.pri)
|
||||||
|
|
||||||
|
OTHER_FILES += \
|
||||||
|
rasterwindow.pri
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
main.cpp
|
138
src/gui/doc/examples/analogclockwindow.qdoc
Normal file
138
src/gui/doc/examples/analogclockwindow.qdoc
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
** This file is part of the documentation of the Qt Toolkit.
|
||||||
|
**
|
||||||
|
** $QT_BEGIN_LICENSE:FDL$
|
||||||
|
** GNU Free Documentation License
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU Free
|
||||||
|
** Documentation License version 1.3 as published by the Free Software
|
||||||
|
** Foundation and appearing in the file included in the packaging of
|
||||||
|
** this file.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms
|
||||||
|
** and conditions contained in a signed written agreement between you
|
||||||
|
** and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\example gui/analogclock
|
||||||
|
\title Analog Clock Window Example
|
||||||
|
|
||||||
|
The Analog Clock Window example shows how to draw the contents of
|
||||||
|
a custom window.
|
||||||
|
|
||||||
|
\image analogclock-window-example.png Screenshot of the Analog
|
||||||
|
Clock Window example
|
||||||
|
|
||||||
|
This example demonstrates how the transformation and scaling
|
||||||
|
features of QPainter can be used to make drawing easier.
|
||||||
|
|
||||||
|
\section1 AnalogClockWindow Class Definition
|
||||||
|
|
||||||
|
The \c AnalogClockWindow class provides a clock with hour and
|
||||||
|
minute hands that is automatically updated every few seconds. We
|
||||||
|
make use of the RasterWindow from the \l {Raster Window Example}
|
||||||
|
and reimplement the \c render function to draw the clock face:
|
||||||
|
|
||||||
|
\snippet gui/analogclock/main.cpp 5
|
||||||
|
|
||||||
|
\section1 AnalogClock Class Implementation
|
||||||
|
|
||||||
|
\snippet gui/analogclock/main.cpp 6
|
||||||
|
|
||||||
|
We set a title on the window and resize to a resonable size. Then
|
||||||
|
we start a timer which we will use to redraw the clock every
|
||||||
|
second.
|
||||||
|
|
||||||
|
\snippet gui/analogclock/main.cpp 7
|
||||||
|
|
||||||
|
The timerEvent function is called every second as a result of
|
||||||
|
our startTimer call. Making use of the convenience in the base
|
||||||
|
class, we schedule the window to be repainted.
|
||||||
|
|
||||||
|
Checking the timer's id is not strictly needed as we only have
|
||||||
|
one active timer in this instance, but it is good practice to do
|
||||||
|
so.
|
||||||
|
|
||||||
|
\snippet gui/analogclock/main.cpp 14
|
||||||
|
\snippet gui/analogclock/main.cpp 8
|
||||||
|
|
||||||
|
Before we set up the painter and draw the clock, we first define
|
||||||
|
two lists of \l {QPoint}s and two \l{QColor}s that will be used
|
||||||
|
for the hour and minute hands. The minute hand's color has an
|
||||||
|
alpha component of 191, meaning that it's 75% opaque.
|
||||||
|
|
||||||
|
\snippet gui/analogclock/main.cpp 9
|
||||||
|
|
||||||
|
We call QPainter::setRenderHint() with QPainter::Antialiasing to
|
||||||
|
turn on antialiasing. This makes drawing of diagonal lines much
|
||||||
|
smoother.
|
||||||
|
|
||||||
|
\snippet gui/analogclock/main.cpp 10
|
||||||
|
|
||||||
|
The translation moves the origin to the center of the window, and
|
||||||
|
the scale operation ensures that the following drawing operations
|
||||||
|
are scaled to fit within the window. We use a scale factor that
|
||||||
|
let's us use x and y coordinates between -100 and 100, and that
|
||||||
|
ensures that these lie within the length of the window's shortest
|
||||||
|
side.
|
||||||
|
|
||||||
|
To make our code simpler, we will draw a fixed size clock face that will
|
||||||
|
be positioned and scaled so that it lies in the center of the window.
|
||||||
|
|
||||||
|
We also determine the length of the window's shortest side so that we
|
||||||
|
can fit the clock face inside the window.
|
||||||
|
|
||||||
|
The painter takes care of all the transformations made during the
|
||||||
|
rendering, and ensures that everything is drawn correctly. Letting
|
||||||
|
the painter handle transformations is often easier than performing
|
||||||
|
manual calculations.
|
||||||
|
|
||||||
|
\image analogclockwindow-viewport.png
|
||||||
|
|
||||||
|
We draw the hour hand first, using a formula that rotates the coordinate
|
||||||
|
system counterclockwise by a number of degrees determined by the current
|
||||||
|
hour and minute. This means that the hand will be shown rotated clockwise
|
||||||
|
by the required amount.
|
||||||
|
|
||||||
|
\snippet gui/analogclock/main.cpp 11
|
||||||
|
|
||||||
|
We set the pen to be Qt::NoPen because we don't want any outline,
|
||||||
|
and we use a solid brush with the color appropriate for
|
||||||
|
displaying hours. Brushes are used when filling in polygons and
|
||||||
|
other geometric shapes.
|
||||||
|
|
||||||
|
\snippet gui/analogclock/main.cpp 2
|
||||||
|
|
||||||
|
We save and restore the transformation matrix before and after the
|
||||||
|
rotation because we want to place the minute hand without having to
|
||||||
|
take into account any previous rotations.
|
||||||
|
|
||||||
|
\snippet gui/analogclock/main.cpp 12
|
||||||
|
|
||||||
|
We draw markers around the edge of the clock for each hour. We
|
||||||
|
draw each marker then rotate the coordinate system so that the
|
||||||
|
painter is ready for the next one.
|
||||||
|
|
||||||
|
\snippet gui/analogclock/main.cpp 13
|
||||||
|
\snippet gui/analogclock/main.cpp 3
|
||||||
|
|
||||||
|
The minute hand is rotated in a similar way to the hour hand.
|
||||||
|
|
||||||
|
\snippet gui/analogclock/main.cpp 4
|
||||||
|
|
||||||
|
Again, we draw markers around the edge of the clock, but this
|
||||||
|
time to indicate minutes. We skip multiples of 5 to avoid drawing
|
||||||
|
minute markers on top of hour markers.
|
||||||
|
*/
|
161
src/gui/doc/examples/rasterwindow.qdoc
Normal file
161
src/gui/doc/examples/rasterwindow.qdoc
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
** Contact: http://www.qt-project.org/
|
||||||
|
**
|
||||||
|
** This file is part of the documentation of the Qt Toolkit.
|
||||||
|
**
|
||||||
|
** $QT_BEGIN_LICENSE:FDL$
|
||||||
|
** GNU Free Documentation License
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU Free
|
||||||
|
** Documentation License version 1.3 as published by the Free Software
|
||||||
|
** Foundation and appearing in the file included in the packaging of
|
||||||
|
** this file.
|
||||||
|
**
|
||||||
|
** Other Usage
|
||||||
|
** Alternatively, this file may be used in accordance with the terms
|
||||||
|
** and conditions contained in a signed written agreement between you
|
||||||
|
** and Nokia.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\example gui/rasterwindow
|
||||||
|
\title Raster Window Example
|
||||||
|
|
||||||
|
This example shows how to create a minimal QWindow based
|
||||||
|
application using QPainter for rendering.
|
||||||
|
|
||||||
|
|
||||||
|
\section1 Application Entry Point
|
||||||
|
|
||||||
|
\snippet gui/rasterwindow/main.cpp 1
|
||||||
|
|
||||||
|
The entry point for a QWindow based application is the \l
|
||||||
|
QGuiApplication class. It manages the GUI application's control
|
||||||
|
flow and main settings. We pass the command line arguments which
|
||||||
|
can be used to pick up certain system wide options.
|
||||||
|
|
||||||
|
From there, we go on to create our window instance and then call
|
||||||
|
the \l QWindow::show() function to tell the windowing system that
|
||||||
|
this window should now be made visible on screen.
|
||||||
|
|
||||||
|
Once this is done, we enter the application's event loop so the
|
||||||
|
application can run.
|
||||||
|
|
||||||
|
|
||||||
|
\section1 RasterWindow Declaration
|
||||||
|
|
||||||
|
\snippet gui/rasterwindow/rasterwindow.h 1
|
||||||
|
|
||||||
|
We first start by including the the QtGui headers. This means we
|
||||||
|
can use all classes in the Qt GUI module. Classes can also be
|
||||||
|
included individually if that is preferred.
|
||||||
|
|
||||||
|
The RasterWindow class subclasses QWindow directly and provides a
|
||||||
|
constructor which allows the window to be a sub-window of another
|
||||||
|
QWindow. Parent-less QWindows show up in the windowing system as
|
||||||
|
top-level windows.
|
||||||
|
|
||||||
|
The class declares a QBackingStore which is what we use to manage
|
||||||
|
the window's back buffer for QPainter based graphics.
|
||||||
|
|
||||||
|
\e {The raster window is also reused in a few other examples and adds
|
||||||
|
a few helper functions, like renderLater().}
|
||||||
|
|
||||||
|
|
||||||
|
\section1 RasterWindow Implementation
|
||||||
|
|
||||||
|
\snippet gui/rasterwindow/rasterwindow.cpp 1
|
||||||
|
|
||||||
|
The constructor first of all calls \l QWindow::create(). This will
|
||||||
|
create the window in the windowing system. Without calling create,
|
||||||
|
the window will not get events and will not be visible in the
|
||||||
|
windowing system. The call to create does not show the window. We
|
||||||
|
then set the geometry to be something resonable.
|
||||||
|
|
||||||
|
Then we create the backingstore and pass it the window instance it
|
||||||
|
is supposed to manage.
|
||||||
|
|
||||||
|
\snippet gui/rasterwindow/rasterwindow.cpp 2
|
||||||
|
|
||||||
|
Shortly after calling \l QWindow::show() on a created window, the
|
||||||
|
virtual function \l QWindow::exposeEvent() will be called to
|
||||||
|
notify us that the window's exposure in the windowing system has
|
||||||
|
changed. The event contains the exposed sub-region, but since we
|
||||||
|
will anyway draw the entire window every time, we do not make use
|
||||||
|
of that.
|
||||||
|
|
||||||
|
The function \l QWindow::isExposed() will tell us if the window is
|
||||||
|
showing or not. We need this as the exposeEvent is called also
|
||||||
|
when the window becomes obscured in the windowing system. If the
|
||||||
|
window is showing, we call renderNow() to draw the window
|
||||||
|
immediately. We want to draw right away so we can present the
|
||||||
|
system with some visual content.
|
||||||
|
|
||||||
|
|
||||||
|
\snippet gui/rasterwindow/rasterwindow.cpp 5
|
||||||
|
|
||||||
|
The resize event is guaranteed to be called prior to the window
|
||||||
|
being shown on screen and will also be called whenever the window
|
||||||
|
is resized while on screen. We use this to resize the back buffer
|
||||||
|
and call renderNow() if we are visible to immediately update the
|
||||||
|
visual representation of the window on screen.
|
||||||
|
|
||||||
|
\snippet gui/rasterwindow/rasterwindow.cpp 3
|
||||||
|
|
||||||
|
The renderNow function sets up what is needed for a \l QWindow to
|
||||||
|
render its content using QPainter. As obscured windows have will
|
||||||
|
not be visible, we abort if the window is not exposed in the
|
||||||
|
windowing system. This can for instance happen when another window
|
||||||
|
fully obscures this window.
|
||||||
|
|
||||||
|
We start the drawing by calling \l QBackingStore::beginPaint() on
|
||||||
|
the region we want to draw. Then we get the \l QPaintDevice of the
|
||||||
|
back buffer and create a QPainter to render to that paint device.
|
||||||
|
|
||||||
|
To void leaving traces from the previous rendering and start with a
|
||||||
|
clean buffer, we fill the entire buffer with the color white. Then
|
||||||
|
we call the virtual render() function which does the actual
|
||||||
|
drawing of this window.
|
||||||
|
|
||||||
|
After drawing is complete, we call endPaint() to signal that we
|
||||||
|
are done rendering and present the contents in the back buffer
|
||||||
|
using \l QBackingStore::flush().
|
||||||
|
|
||||||
|
|
||||||
|
\snippet gui/rasterwindow/rasterwindow.cpp 4
|
||||||
|
|
||||||
|
The render function contains the drawing code for the window. In
|
||||||
|
this minial example, we only draw the string "QWindow" in the
|
||||||
|
center.
|
||||||
|
|
||||||
|
|
||||||
|
\section1 Rendering Asynchronously
|
||||||
|
|
||||||
|
|
||||||
|
\snippet gui/rasterwindow/rasterwindow.cpp 6
|
||||||
|
|
||||||
|
We went through a few places where the window needed to repainted
|
||||||
|
immediately. There are some cases where this is not desierable,
|
||||||
|
but rather let the application return to the event loop and
|
||||||
|
later. We acheive this by posting an even to ourself which will
|
||||||
|
then be delivered when the application returns to the \l
|
||||||
|
QGuiApplication event loop. To avoid posting new requests when one
|
||||||
|
is already pending, we store this state in the \c m_update_pending
|
||||||
|
variable.
|
||||||
|
|
||||||
|
\snippet gui/rasterwindow/rasterwindow.cpp 7
|
||||||
|
|
||||||
|
We reimplement the virtual \l QObject::event() function to handle
|
||||||
|
the update event we posted to ourselves. When the event comes in
|
||||||
|
we reset the pending update flag and call renderNow() to render
|
||||||
|
the window right away.
|
||||||
|
|
||||||
|
*/
|
BIN
src/gui/doc/images/analogclock-window-example.png
Normal file
BIN
src/gui/doc/images/analogclock-window-example.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.3 KiB |
BIN
src/gui/doc/images/analogclockwindow-viewport.png
Normal file
BIN
src/gui/doc/images/analogclockwindow-viewport.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
@ -230,14 +230,13 @@
|
|||||||
\row
|
\row
|
||||||
\li {2,1}
|
\li {2,1}
|
||||||
|
|
||||||
\snippet widgets/analogclock/analogclock.cpp 9
|
\snippet gui/analogclock/main.cpp 1
|
||||||
|
|
||||||
First, we set up the painter. We translate the coordinate system
|
We translate the coordinate system so that point (0, 0) is in the
|
||||||
so that point (0, 0) is in the widget's center, instead of being
|
widget's center, instead of being at the top-left corner. We also
|
||||||
at the top-left corner. We also scale the system by \c side / 100,
|
scale the system by \c side / 100, where \c side is either the
|
||||||
where \c side is either the widget's width or the height,
|
widget's width or the height, whichever is shortest. We want the
|
||||||
whichever is shortest. We want the clock to be square, even if the
|
clock to be square, even if the device isn't.
|
||||||
device isn't.
|
|
||||||
|
|
||||||
This will give us a 200 x 200 square area, with the origin (0, 0)
|
This will give us a 200 x 200 square area, with the origin (0, 0)
|
||||||
in the center, that we can draw on. What we draw will show up in
|
in the center, that we can draw on. What we draw will show up in
|
||||||
@ -245,7 +244,7 @@
|
|||||||
|
|
||||||
See also the \l {Window-Viewport Conversion} section.
|
See also the \l {Window-Viewport Conversion} section.
|
||||||
|
|
||||||
\snippet widgets/analogclock/analogclock.cpp 18
|
\snippet gui/analogclock/main.cpp 2
|
||||||
|
|
||||||
We draw the clock's hour hand by rotating the coordinate system
|
We draw the clock's hour hand by rotating the coordinate system
|
||||||
and calling QPainter::drawConvexPolygon(). Thank's to the
|
and calling QPainter::drawConvexPolygon(). Thank's to the
|
||||||
@ -260,14 +259,14 @@
|
|||||||
the code guarantees that the code that follows won't be disturbed
|
the code guarantees that the code that follows won't be disturbed
|
||||||
by the transformations we've used.
|
by the transformations we've used.
|
||||||
|
|
||||||
\snippet widgets/analogclock/analogclock.cpp 24
|
\snippet gui/analogclock/main.cpp 3
|
||||||
|
|
||||||
We do the same for the clock's minute hand, which is defined by
|
We do the same for the clock's minute hand, which is defined by
|
||||||
the four points (1, 0), (0, 1), (-1, 0), and (0, -40). These
|
the four points (1, 0), (0, 1), (-1, 0), and (0, -40). These
|
||||||
coordinates specify a hand that is thinner and longer than the
|
coordinates specify a hand that is thinner and longer than the
|
||||||
minute hand.
|
minute hand.
|
||||||
|
|
||||||
\snippet widgets/analogclock/analogclock.cpp 27
|
\snippet gui/analogclock/main.cpp 4
|
||||||
|
|
||||||
Finally, we draw the clock face, which consists of twelve short
|
Finally, we draw the clock face, which consists of twelve short
|
||||||
lines at 30-degree intervals. At the end of that, the painter is
|
lines at 30-degree intervals. At the end of that, the painter is
|
||||||
@ -440,9 +439,5 @@
|
|||||||
\endtable
|
\endtable
|
||||||
\endomit
|
\endomit
|
||||||
|
|
||||||
\sa {Analog Clock Example}
|
\sa {Analog Clock Window Example}
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
### DOC-TODO: rewrite analog clock to be QWindow based
|
|
||||||
*/
|
*/
|
@ -63,6 +63,7 @@
|
|||||||
For application developers writing user interfaces, Qt provides
|
For application developers writing user interfaces, Qt provides
|
||||||
higher level API's, like Qt Quick, that are much more suitable
|
higher level API's, like Qt Quick, that are much more suitable
|
||||||
than the enablers found in the Qt GUI module.
|
than the enablers found in the Qt GUI module.
|
||||||
|
than the enablers found in the Qt GUI module.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -92,7 +93,7 @@
|
|||||||
{QBackingStore} and \l {QPainter}, Qt's highly optimized 2D vector
|
{QBackingStore} and \l {QPainter}, Qt's highly optimized 2D vector
|
||||||
graphics API. QPainter supports drawing lines, polygons, vector
|
graphics API. QPainter supports drawing lines, polygons, vector
|
||||||
paths, images and text. For more information, see \l{Paint
|
paths, images and text. For more information, see \l{Paint
|
||||||
System}.
|
System} and \l {Raster Window Example}.
|
||||||
|
|
||||||
Qt can load and save images using the \l QImage and \l QPixmap
|
Qt can load and save images using the \l QImage and \l QPixmap
|
||||||
classes. By default, Qt supports the most common image formats
|
classes. By default, Qt supports the most common image formats
|
||||||
@ -129,7 +130,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\section1 Qt GUI prior to Qt 5.0
|
\section1 Qt GUI prior to Qt 5.0
|
||||||
|
|
||||||
Prior to Qt 5.0, the Qt GUI library was the monolithic container
|
Prior to Qt 5.0, the Qt GUI library was the monolithic container
|
||||||
@ -148,14 +148,6 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
### DOC-TODO: link under AppWindows to hello-world for QWindow in
|
|
||||||
examples/gui/windows/hello-qtgui. (Idea: QWindow which
|
|
||||||
reimplements mouseEvent() to exit)
|
|
||||||
|
|
||||||
### DOC-TODO: link under Painting to hello-raster for QWindow
|
|
||||||
in examples/gui/graphics/rasterwindow. Idea: QWindow with BS
|
|
||||||
which draws a rotating rectangle with some text underneath.
|
|
||||||
|
|
||||||
### DOC-TODO: link under OpenGL to hello-opengl for QWindow in
|
### DOC-TODO: link under OpenGL to hello-opengl for QWindow in
|
||||||
examples/gui/opengl/openglwindow. Idea: QWindow which draws a
|
examples/gui/opengl/openglwindow. Idea: QWindow which draws a
|
||||||
triangle using GLES 2.0 compatible shaders. Do not care about
|
triangle using GLES 2.0 compatible shaders. Do not care about
|
||||||
|
Loading…
x
Reference in New Issue
Block a user