From 61114c608d0097e90cded814f430b9904db7c47b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Tue, 3 May 2011 14:47:10 +0200 Subject: Pure QWindow with multiple windows and child windows example added. --- examples/examples.pro | 1 + examples/qpa/qpa.pro | 8 +++ examples/qpa/windows/main.cpp | 19 ++++++ examples/qpa/windows/window.cpp | 131 +++++++++++++++++++++++++++++++++++++++ examples/qpa/windows/window.h | 25 ++++++++ examples/qpa/windows/windows.pro | 12 ++++ 6 files changed, 196 insertions(+) create mode 100644 examples/qpa/qpa.pro create mode 100644 examples/qpa/windows/main.cpp create mode 100644 examples/qpa/windows/window.cpp create mode 100644 examples/qpa/windows/window.h create mode 100644 examples/qpa/windows/windows.pro (limited to 'examples') diff --git a/examples/examples.pro b/examples/examples.pro index 0680ff45f6..c070b3cdd4 100644 --- a/examples/examples.pro +++ b/examples/examples.pro @@ -48,6 +48,7 @@ symbian: SUBDIRS = \ SUBDIRS += multimedia } +qpa:SUBDIRS += qpa embedded:SUBDIRS += qws contains(QT_BUILD_PARTS, tools):!contains(QT_CONFIG, no-gui):SUBDIRS += qtestlib contains(QT_CONFIG, opengl): SUBDIRS += opengl diff --git a/examples/qpa/qpa.pro b/examples/qpa/qpa.pro new file mode 100644 index 0000000000..b1b4428c23 --- /dev/null +++ b/examples/qpa/qpa.pro @@ -0,0 +1,8 @@ +TEMPLATE = subdirs +SUBDIRS = windows + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/qtbase/qpa +sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS qpa.pro +sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/qpa +INSTALLS += target sources diff --git a/examples/qpa/windows/main.cpp b/examples/qpa/windows/main.cpp new file mode 100644 index 0000000000..99c24fa017 --- /dev/null +++ b/examples/qpa/windows/main.cpp @@ -0,0 +1,19 @@ +#include + +#include "window.h" + +int main(int argc, char **argv) +{ + QGuiApplication app(argc, argv); + + Window a; + a.setVisible(true); + + Window b; + b.setVisible(true); + + Window child(&b); + child.setVisible(true); + + return app.exec(); +} diff --git a/examples/qpa/windows/window.cpp b/examples/qpa/windows/window.cpp new file mode 100644 index 0000000000..0f3355b86b --- /dev/null +++ b/examples/qpa/windows/window.cpp @@ -0,0 +1,131 @@ +#include "window.h" + +#include +#include + +#include + +static int colorIndexId = 0; + +QColor colorTable[] = +{ + QColor("#f09f8f"), + QColor("#a2bff2"), + QColor("#c0ef8f") +}; + +Window::Window(QWindow *parent) + : QWindow(0) + , m_backgroundColorIndex(colorIndexId++) +{ + setSurfaceType(RasterSurface); + setWindowTitle(QLatin1String("Window")); + + if (parent) + setGeometry(QRect(10, 10, 40, 40)); + else + setGeometry(QRect(10, 10, 640, 480)); + + if (parent) { + setParent(parent); + setGeometry(QRect(160, 120, 320, 240)); + } + + create(); + QGuiApplicationPrivate::platformIntegration()->createWindowSurface(this, winId()); + + m_image = QImage(geometry().size(), QImage::Format_RGB32); + m_image.fill(colorTable[m_backgroundColorIndex % (sizeof(colorTable) / sizeof(colorTable[0]))].rgba()); + + m_lastPos = QPoint(-1, -1); + + render(); +} + +void Window::mousePressEvent(QMouseEvent *event) +{ + m_lastPos = event->pos(); +} + +void Window::mouseMoveEvent(QMouseEvent *event) +{ + if (m_lastPos != QPoint(-1, -1)) { + QPainter p(&m_image); + p.setRenderHint(QPainter::Antialiasing); + p.drawLine(m_lastPos, event->pos()); + m_lastPos = event->pos(); + } + + render(); +} + +void Window::mouseReleaseEvent(QMouseEvent *event) +{ + if (m_lastPos != QPoint(-1, -1)) { + QPainter p(&m_image); + p.setRenderHint(QPainter::Antialiasing); + p.drawLine(m_lastPos, event->pos()); + m_lastPos = QPoint(-1, -1); + } + + render(); +} + +void Window::resizeEvent(QResizeEvent *) +{ + QImage old = m_image; + + int width = qMax(geometry().width(), old.width()); + int height = qMax(geometry().height(), old.height()); + + if (width > old.width() || height > old.height()) { + m_image = QImage(width, height, QImage::Format_RGB32); + m_image.fill(colorTable[(m_backgroundColorIndex) % (sizeof(colorTable) / sizeof(colorTable[0]))].rgba()); + + QPainter p(&m_image); + p.drawImage(0, 0, old); + } + + render(); +} + +void Window::keyPressEvent(QKeyEvent *event) +{ + switch (event->key()) { + case Qt::Key_Backspace: + m_text.chop(1); + break; + case Qt::Key_Enter: + case Qt::Key_Return: + m_text.append('\n'); + break; + default: + m_text.append(event->text()); + break; + } + render(); +} + +void Window::render() +{ + QRect rect(QPoint(), geometry().size()); + surface()->resize(rect.size()); + + surface()->beginPaint(rect); + + QPaintDevice *device = surface()->paintDevice(); + + QPainter p(device); + p.drawImage(0, 0, m_image); + + QFont font; + font.setPixelSize(32); + + p.setFont(font); + p.drawText(rect, 0, m_text); + + surface()->endPaint(rect); + surface()->flush(this, rect, QPoint()); +} + + diff --git a/examples/qpa/windows/window.h b/examples/qpa/windows/window.h new file mode 100644 index 0000000000..f0b7d80531 --- /dev/null +++ b/examples/qpa/windows/window.h @@ -0,0 +1,25 @@ +#include +#include + +class Window : public QWindow +{ +public: + Window(QWindow *parent = 0); + +protected: + void mousePressEvent(QMouseEvent *); + void mouseMoveEvent(QMouseEvent *); + void mouseReleaseEvent(QMouseEvent *); + + void keyPressEvent(QKeyEvent *); + + void resizeEvent(QResizeEvent *); + +private: + void render(); + + QString m_text; + QImage m_image; + QPoint m_lastPos; + int m_backgroundColorIndex; +}; diff --git a/examples/qpa/windows/windows.pro b/examples/qpa/windows/windows.pro new file mode 100644 index 0000000000..a7e3bf6db5 --- /dev/null +++ b/examples/qpa/windows/windows.pro @@ -0,0 +1,12 @@ +###################################################################### +# Automatically generated by qmake (2.01a) Wed Apr 27 16:40:46 2011 +###################################################################### + +TEMPLATE = app +TARGET = +DEPENDPATH += . +INCLUDEPATH += . + +# Input +HEADERS += window.h +SOURCES += window.cpp main.cpp -- cgit v1.2.3