aboutsummaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2017-04-13 20:56:01 +0200
committerShawn Rutledge <shawn.rutledge@qt.io>2017-04-13 20:56:01 +0200
commit1fb1c6c4f8769250dffa375e3941738eb1fcc885 (patch)
tree4f4c4afae97b54a793a0589f8ca53b7c919de728 /examples
parentd0ce320646b7f852a24f6e0a9e9621ddcedef554 (diff)
parent9c1c471e54bb12e8740b76d1c048f2f916a6ab59 (diff)
Merge remote-tracking branch 'origin/dev' into wip/pointerhandler
Diffstat (limited to 'examples')
-rw-r--r--examples/qml/doc/src/qml-extending.qdoc18
-rw-r--r--examples/qml/referenceexamples/properties/birthdayparty.cpp31
-rw-r--r--examples/qml/referenceexamples/properties/birthdayparty.h10
-rw-r--r--examples/quick/demos/demos.pro6
-rw-r--r--examples/quick/demos/stocqt/content/StockListModel.qml35
-rw-r--r--examples/quick/rendercontrol/window_singlethreaded.cpp46
-rw-r--r--examples/quick/rendercontrol/window_singlethreaded.h2
7 files changed, 109 insertions, 39 deletions
diff --git a/examples/qml/doc/src/qml-extending.qdoc b/examples/qml/doc/src/qml-extending.qdoc
index b4174426a8..f99aca5457 100644
--- a/examples/qml/doc/src/qml-extending.qdoc
+++ b/examples/qml/doc/src/qml-extending.qdoc
@@ -73,24 +73,24 @@ This example builds on:
\li \l {Extending QML - Adding Types Example}
\endlist
-Shows how to use \l {QQmlEngine::}{qmlRegisterExtendedType()} to provide an \l {Registering
-Extension Objects}{extension object} to a \l QLineEdit without modifying or
-subclassing.
+Shows how to use \l {QQmlEngine::}{qmlRegisterExtendedType()} to provide an
+\l {Registering Extension Objects}{extension object} to a \l QLineEdit without modifying or
+subclassing it.
+
+Firstly, the LineEditExtension class is registered with the QML system as an extension of QLineEdit:
\snippet referenceexamples/extended/main.cpp 0
-The QML engine instantiates a \l QLineEdit
+The QML engine then instantiates a \l QLineEdit:
\snippet referenceexamples/extended/main.cpp 1
-and sets a property that oly exists on the extension type.
+In QML, a property is set on the line edit that only exists in the LineEditExtension class:
\snippet referenceexamples/extended/example.qml 0
-The QML engine instantiates a \l QLineEdit and sets a property that
-only exists on the extension type. The extension type performs calls on the
-\l QLineEdit that otherwise will not be accessible to the QML engine.
-
+The extension type performs calls on the \l QLineEdit that otherwise will
+not be accessible to the QML engine.
*/
/*!
diff --git a/examples/qml/referenceexamples/properties/birthdayparty.cpp b/examples/qml/referenceexamples/properties/birthdayparty.cpp
index b69b7c8a11..0b426fc00b 100644
--- a/examples/qml/referenceexamples/properties/birthdayparty.cpp
+++ b/examples/qml/referenceexamples/properties/birthdayparty.cpp
@@ -57,9 +57,18 @@ void BirthdayParty::setHost(Person *c)
QQmlListProperty<Person> BirthdayParty::guests()
{
- return QQmlListProperty<Person>(this, m_guests);
+ return QQmlListProperty<Person>(this, this,
+ &BirthdayParty::appendGuest,
+ &BirthdayParty::guestCount,
+ &BirthdayParty::guest,
+ &BirthdayParty::clearGuests);
}
+void BirthdayParty::appendGuest(Person* p) {
+ m_guests.append(p);
+}
+
+
int BirthdayParty::guestCount() const
{
return m_guests.count();
@@ -69,5 +78,25 @@ Person *BirthdayParty::guest(int index) const
{
return m_guests.at(index);
}
+
+void BirthdayParty::clearGuests() {
+ return m_guests.clear();
+}
+
// ![0]
+void BirthdayParty::appendGuest(QQmlListProperty<Person>* list, Person* p) {
+ reinterpret_cast< BirthdayParty* >(list->data)->appendGuest(p);
+}
+
+void BirthdayParty::clearGuests(QQmlListProperty<Person>* list) {
+ reinterpret_cast< BirthdayParty* >(list->data)->clearGuests();
+}
+
+Person* BirthdayParty::guest(QQmlListProperty<Person>* list, int i) {
+ return reinterpret_cast< BirthdayParty* >(list->data)->guest(i);
+}
+
+int BirthdayParty::guestCount(QQmlListProperty<Person>* list) {
+ return reinterpret_cast< BirthdayParty* >(list->data)->guestCount();
+}
diff --git a/examples/qml/referenceexamples/properties/birthdayparty.h b/examples/qml/referenceexamples/properties/birthdayparty.h
index d0a2cad285..df55df3e80 100644
--- a/examples/qml/referenceexamples/properties/birthdayparty.h
+++ b/examples/qml/referenceexamples/properties/birthdayparty.h
@@ -41,6 +41,7 @@
#define BIRTHDAYPARTY_H
#include <QObject>
+#include <QVector>
#include <QQmlListProperty>
#include "person.h"
@@ -63,12 +64,19 @@ public:
void setHost(Person *);
QQmlListProperty<Person> guests();
+ void appendGuest(Person*);
int guestCount() const;
Person *guest(int) const;
+ void clearGuests();
private:
+ static void appendGuest(QQmlListProperty<Person>*, Person*);
+ static int guestCount(QQmlListProperty<Person>*);
+ static Person* guest(QQmlListProperty<Person>*, int);
+ static void clearGuests(QQmlListProperty<Person>*);
+
Person *m_host;
- QList<Person *> m_guests;
+ QVector<Person *> m_guests;
};
// ![3]
diff --git a/examples/quick/demos/demos.pro b/examples/quick/demos/demos.pro
index 0644b81a22..5a6fd52baf 100644
--- a/examples/quick/demos/demos.pro
+++ b/examples/quick/demos/demos.pro
@@ -7,5 +7,7 @@ SUBDIRS = samegame \
photosurface \
stocqt
-qtHaveModule(xmlpatterns): SUBDIRS += rssnews photoviewer
-
+qtHaveModule(xmlpatterns) {
+ SUBDIRS += rssnews
+ qtHaveModule(widgets): SUBDIRS += photoviewer
+}
diff --git a/examples/quick/demos/stocqt/content/StockListModel.qml b/examples/quick/demos/stocqt/content/StockListModel.qml
index 9b48124bda..02ece32a49 100644
--- a/examples/quick/demos/stocqt/content/StockListModel.qml
+++ b/examples/quick/demos/stocqt/content/StockListModel.qml
@@ -82,27 +82,28 @@ ListModel {
xhr.onreadystatechange = function() {
if (xhr.readyState === XMLHttpRequest.LOADING || xhr.readyState === XMLHttpRequest.DONE) {
var records = xhr.responseText.split('\n');
+ var unknown = "n/a";
+ set(index, {"value": unknown, "change": unknown, "changePercentage": unknown});
if (records.length > 0 && xhr.status == 200) {
var r = records[1].split(',');
var today = parseFloat(r[4]);
- setProperty(index, "value", today.toFixed(2));
+ if (!isNaN(today))
+ setProperty(index, "value", today.toFixed(2));
+ if (records.length > 2) {
+ r = records[2].split(',');
+ var yesterday = parseFloat(r[4]);
+ var change = today - yesterday;
+ if (change >= 0.0)
+ setProperty(index, "change", "+" + change.toFixed(2));
+ else
+ setProperty(index, "change", change.toFixed(2));
- r = records[2].split(',');
- var yesterday = parseFloat(r[4]);
- var change = today - yesterday;
- if (change >= 0.0)
- setProperty(index, "change", "+" + change.toFixed(2));
- else
- setProperty(index, "change", change.toFixed(2));
-
- var changePercentage = (change / yesterday) * 100.0;
- if (changePercentage >= 0.0)
- setProperty(index, "changePercentage", "+" + changePercentage.toFixed(2) + "%");
- else
- setProperty(index, "changePercentage", changePercentage.toFixed(2) + "%");
- } else {
- var unknown = "n/a";
- set(index, {"value": unknown, "change": unknown, "changePercentage": unknown});
+ var changePercentage = (change / yesterday) * 100.0;
+ if (changePercentage >= 0.0)
+ setProperty(index, "changePercentage", "+" + changePercentage.toFixed(2) + "%");
+ else
+ setProperty(index, "changePercentage", changePercentage.toFixed(2) + "%");
+ }
}
}
}
diff --git a/examples/quick/rendercontrol/window_singlethreaded.cpp b/examples/quick/rendercontrol/window_singlethreaded.cpp
index ef8f2fed43..bd4de9a7cb 100644
--- a/examples/quick/rendercontrol/window_singlethreaded.cpp
+++ b/examples/quick/rendercontrol/window_singlethreaded.cpp
@@ -82,6 +82,10 @@ WindowSingleThreaded::WindowSingleThreaded()
{
setSurfaceType(QSurface::OpenGLSurface);
+ // The rendercontrol does not necessarily need an FBO. Demonstrate this
+ // when requested.
+ m_onscreen = QCoreApplication::arguments().contains(QStringLiteral("--onscreen"));
+
QSurfaceFormat format;
// Qt Quick may need a depth and stencil buffer. Always make sure these are available.
format.setDepthBufferSize(16);
@@ -164,8 +168,14 @@ void WindowSingleThreaded::createFbo()
// The scene graph has been initialized. It is now time to create an FBO and associate
// it with the QQuickWindow.
m_dpr = devicePixelRatio();
- m_fbo = new QOpenGLFramebufferObject(size() * m_dpr, QOpenGLFramebufferObject::CombinedDepthStencil);
- m_quickWindow->setRenderTarget(m_fbo);
+ if (!m_onscreen) {
+ m_fbo = new QOpenGLFramebufferObject(size() * m_dpr, QOpenGLFramebufferObject::CombinedDepthStencil);
+ m_quickWindow->setRenderTarget(m_fbo);
+ } else {
+ // Special case: No FBO. Render directly to the window's default framebuffer.
+ m_onscreenSize = size() * m_dpr;
+ m_quickWindow->setRenderTarget(0, m_onscreenSize);
+ }
}
void WindowSingleThreaded::destroyFbo()
@@ -176,7 +186,10 @@ void WindowSingleThreaded::destroyFbo()
void WindowSingleThreaded::render()
{
- if (!m_context->makeCurrent(m_offscreenSurface))
+ QSurface *surface = m_offscreenSurface;
+ if (m_onscreen)
+ surface = this;
+ if (!m_context->makeCurrent(surface))
return;
// Polish, synchronize and render the next frame (into our fbo). In this example
@@ -195,7 +208,10 @@ void WindowSingleThreaded::render()
m_quickReady = true;
// Get something onto the screen.
- m_cubeRenderer->render(this, m_context, m_quickReady ? m_fbo->texture() : 0);
+ if (!m_onscreen)
+ m_cubeRenderer->render(this, m_context, m_quickReady ? m_fbo->texture() : 0);
+ else
+ m_context->swapBuffers(this);
}
void WindowSingleThreaded::requestUpdate()
@@ -237,7 +253,10 @@ void WindowSingleThreaded::run()
updateSizes();
// Initialize the render control and our OpenGL resources.
- m_context->makeCurrent(m_offscreenSurface);
+ QSurface *surface = m_offscreenSurface;
+ if (m_onscreen)
+ surface = this;
+ m_context->makeCurrent(surface);
m_renderControl->initialize(m_context);
m_quickInitialized = true;
}
@@ -266,7 +285,8 @@ void WindowSingleThreaded::exposeEvent(QExposeEvent *)
{
if (isExposed()) {
if (!m_quickInitialized) {
- m_cubeRenderer->render(this, m_context, m_quickReady ? m_fbo->texture() : 0);
+ if (!m_onscreen)
+ m_cubeRenderer->render(this, m_context, m_quickReady ? m_fbo->texture() : 0);
startQuick(QStringLiteral("qrc:/rendercontrol/demo.qml"));
}
}
@@ -274,7 +294,10 @@ void WindowSingleThreaded::exposeEvent(QExposeEvent *)
void WindowSingleThreaded::resizeFbo()
{
- if (m_rootItem && m_context->makeCurrent(m_offscreenSurface)) {
+ QSurface *surface = m_offscreenSurface;
+ if (m_onscreen)
+ surface = this;
+ if (m_rootItem && m_context->makeCurrent(surface)) {
delete m_fbo;
createFbo();
m_context->doneCurrent();
@@ -287,8 +310,13 @@ void WindowSingleThreaded::resizeEvent(QResizeEvent *)
{
// If this is a resize after the scene is up and running, recreate the fbo and the
// Quick item and scene.
- if (m_fbo && m_fbo->size() != size() * devicePixelRatio())
- resizeFbo();
+ if (!m_onscreen) {
+ if (m_fbo && m_fbo->size() != size() * devicePixelRatio())
+ resizeFbo();
+ } else {
+ if (m_onscreenSize != size() * devicePixelRatio())
+ resizeFbo();
+ }
}
void WindowSingleThreaded::handleScreenChange()
diff --git a/examples/quick/rendercontrol/window_singlethreaded.h b/examples/quick/rendercontrol/window_singlethreaded.h
index 534d6b9bc3..4736f036ad 100644
--- a/examples/quick/rendercontrol/window_singlethreaded.h
+++ b/examples/quick/rendercontrol/window_singlethreaded.h
@@ -97,6 +97,8 @@ private:
QTimer m_updateTimer;
CubeRenderer *m_cubeRenderer;
qreal m_dpr;
+ bool m_onscreen;
+ QSize m_onscreenSize;
};
#endif