Generate registrations for all examples

Now that we can generate all QML type information at build time, we
should also use it.

Change-Id: I647c72bbe38fdb2deb565b75c86a696af3d15b61
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
This commit is contained in:
Ulf Hermann 2019-09-12 17:03:52 +02:00
parent 4eff729950
commit 2c3419e127
96 changed files with 667 additions and 455 deletions

View File

@ -52,10 +52,6 @@ type, the C++ class can be named differently, or appear in a namespace.
The Person class implementation is quite basic. The property accessors simply The Person class implementation is quite basic. The property accessors simply
return members of the object instance. return members of the object instance.
The \c main.cpp file also calls the \c qmlRegisterType() function to
register the \c Person type with QML as a type in the People library version 1.0,
and defines the mapping between the C++ and QML class names.
\section1 Running the Example \section1 Running the Example
The main.cpp file in the example includes a simple shell application that The main.cpp file in the example includes a simple shell application that
@ -77,9 +73,11 @@ Shows how to use \l {QQmlEngine::}{qmlRegisterExtendedType()} to provide an
\l {Registering Extension Objects}{extension object} to a \l QLineEdit without modifying or \l {Registering Extension Objects}{extension object} to a \l QLineEdit without modifying or
subclassing it. subclassing it.
Firstly, the LineEditExtension class is registered with the QML system as an extension of QLineEdit: Firstly, the LineEditExtension class is registered with the QML system as an
extension of QLineEdit. We declare a foreign type to do this as we cannot modify
Qt's internal QLineEdit class.
\snippet referenceexamples/extended/main.cpp 0 \snippet referenceexamples/extended/lineedit.h 0
The QML engine then instantiates a \l QLineEdit: The QML engine then instantiates a \l QLineEdit:
@ -182,9 +180,8 @@ directly - an explicit Boy or Girl should be instantiated instead.
While we want to disallow instantiating Person from within QML, it still needs While we want to disallow instantiating Person from within QML, it still needs
to be registered with the QML engine, so that it can be used as a property type to be registered with the QML engine, so that it can be used as a property type
and other types can be coerced to it. and other types can be coerced to it. This is what the QML_UNCREATABLE macro
does.
\snippet referenceexamples/coercion/main.cpp 0
\section2 Define Boy and Girl \section2 Define Boy and Girl

View File

@ -49,117 +49,13 @@
****************************************************************************/ ****************************************************************************/
#include <QtQml/QQmlExtensionPlugin> #include <QtQml/QQmlExtensionPlugin>
#include <QtQml/qqml.h>
#include <qdebug.h> #include <qdebug.h>
#include <qdatetime.h>
#include <qbasictimer.h>
#include <qcoreapplication.h>
// Implements a "TimeModel" class with hour and minute properties
// that change on-the-minute yet efficiently sleep the rest
// of the time.
class MinuteTimer : public QObject
{
Q_OBJECT
public:
MinuteTimer(QObject *parent) : QObject(parent)
{
}
void start()
{
if (!timer.isActive()) {
time = QTime::currentTime();
timer.start(60000-time.second()*1000, this);
}
}
void stop()
{
timer.stop();
}
int hour() const { return time.hour(); }
int minute() const { return time.minute(); }
signals:
void timeChanged();
protected:
void timerEvent(QTimerEvent *) override
{
QTime now = QTime::currentTime();
if (now.second() == 59 && now.minute() == time.minute() && now.hour() == time.hour()) {
// just missed time tick over, force it, wait extra 0.5 seconds
time = time.addSecs(60);
timer.start(60500, this);
} else {
time = now;
timer.start(60000-time.second()*1000, this);
}
emit timeChanged();
}
private:
QTime time;
QBasicTimer timer;
};
//![0]
class TimeModel : public QObject
{
Q_OBJECT
Q_PROPERTY(int hour READ hour NOTIFY timeChanged)
Q_PROPERTY(int minute READ minute NOTIFY timeChanged)
QML_NAMED_ELEMENT(Time)
//![0]
public:
TimeModel(QObject *parent=nullptr) : QObject(parent)
{
if (++instances == 1) {
if (!timer)
timer = new MinuteTimer(QCoreApplication::instance());
connect(timer, &MinuteTimer::timeChanged, this, &TimeModel::timeChanged);
timer->start();
}
}
~TimeModel() override
{
if (--instances == 0) {
timer->stop();
}
}
int minute() const { return timer->minute(); }
int hour() const { return timer->hour(); }
signals:
void timeChanged();
private:
QTime t;
static MinuteTimer *timer;
static int instances;
};
int TimeModel::instances=0;
MinuteTimer *TimeModel::timer=nullptr;
//![plugin] //![plugin]
class QExampleQmlPlugin : public QQmlExtensionPlugin class QExampleQmlPlugin : public QQmlEngineExtensionPlugin
{ {
Q_OBJECT Q_OBJECT
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid)
public:
void registerTypes(const char *uri) override
{
Q_ASSERT(uri == QLatin1String("TimeExample"));
qmlRegisterTypesAndRevisions<TimeModel>(uri, 1);
}
}; };
//![plugin] //![plugin]

View File

@ -1,25 +1,37 @@
TEMPLATE = lib TEMPLATE = lib
CONFIG += plugin CONFIG += plugin qmltypes
QT += qml QT += qml
DESTDIR = imports/TimeExample QML_IMPORT_NAME = TimeExample
QML_IMPORT_MAJOR_VERSION = 1
DESTDIR = imports/$$QML_IMPORT_NAME
TARGET = qmlqtimeexampleplugin TARGET = qmlqtimeexampleplugin
SOURCES += plugin.cpp SOURCES += \
plugin.cpp \
timemodel.cpp
pluginfiles.files += \ HEADERS += \
imports/TimeExample/qmldir \ timemodel.h
imports/TimeExample/center.png \
imports/TimeExample/clock.png \ PLUGINFILES = \
imports/TimeExample/Clock.qml \ imports/$$QML_IMPORT_NAME/qmldir \
imports/TimeExample/hour.png \ imports/$$QML_IMPORT_NAME/center.png \
imports/TimeExample/minute.png imports/$$QML_IMPORT_NAME/clock.png \
imports/$$QML_IMPORT_NAME/Clock.qml \
imports/$$QML_IMPORT_NAME/hour.png \
imports/$$QML_IMPORT_NAME/minute.png
pluginfiles.files += $$PLUGINFILES
qml.files = plugins.qml qml.files = plugins.qml
qml.path += $$[QT_INSTALL_EXAMPLES]/qml/qmlextensionplugins qml.path += $$[QT_INSTALL_EXAMPLES]/qml/qmlextensionplugins
target.path += $$[QT_INSTALL_EXAMPLES]/qml/qmlextensionplugins/imports/TimeExample target.path += $$[QT_INSTALL_EXAMPLES]/qml/qmlextensionplugins/imports/$$QML_IMPORT_NAME
pluginfiles.path += $$[QT_INSTALL_EXAMPLES]/qml/qmlextensionplugins/imports/TimeExample pluginfiles.path += $$[QT_INSTALL_EXAMPLES]/qml/qmlextensionplugins/imports/$$QML_IMPORT_NAME
INSTALLS += target qml pluginfiles INSTALLS += target qml pluginfiles
OTHER_FILES += $$PLUGINFILES plugins.qml
CONFIG += install_ok # Do not cargo-cult this! CONFIG += install_ok # Do not cargo-cult this!

View File

@ -0,0 +1,98 @@
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, 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 The Qt Company Ltd 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 "timemodel.h"
int TimeModel::instances=0;
MinuteTimer *TimeModel::timer=nullptr;
void MinuteTimer::start()
{
if (!timer.isActive()) {
time = QTime::currentTime();
timer.start(60000-time.second()*1000, this);
}
}
void MinuteTimer::stop()
{
timer.stop();
}
void MinuteTimer::timerEvent(QTimerEvent *)
{
QTime now = QTime::currentTime();
if (now.second() == 59 && now.minute() == time.minute() && now.hour() == time.hour()) {
// just missed time tick over, force it, wait extra 0.5 seconds
time = time.addSecs(60);
timer.start(60500, this);
} else {
time = now;
timer.start(60000-time.second()*1000, this);
}
emit timeChanged();
}
TimeModel::TimeModel(QObject *parent) : QObject(parent)
{
if (++instances == 1) {
if (!timer)
timer = new MinuteTimer(QCoreApplication::instance());
connect(timer, &MinuteTimer::timeChanged, this, &TimeModel::timeChanged);
timer->start();
}
}
TimeModel::~TimeModel()
{
if (--instances == 0) {
timer->stop();
}
}

View File

@ -0,0 +1,111 @@
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, 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 The Qt Company Ltd 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 TIMEMODEL_H
#define TIMEMODEL_H
#include <QtQml/qqml.h>
#include <QtCore/qdatetime.h>
#include <QtCore/qbasictimer.h>
#include <QtCore/qcoreapplication.h>
// Implements a "TimeModel" class with hour and minute properties
// that change on-the-minute yet efficiently sleep the rest
// of the time.
class MinuteTimer : public QObject
{
Q_OBJECT
public:
MinuteTimer(QObject *parent) : QObject(parent) {}
void start();
void stop();
int hour() const { return time.hour(); }
int minute() const { return time.minute(); }
signals:
void timeChanged();
protected:
void timerEvent(QTimerEvent *) override;
private:
QTime time;
QBasicTimer timer;
};
//![0]
class TimeModel : public QObject
{
Q_OBJECT
Q_PROPERTY(int hour READ hour NOTIFY timeChanged)
Q_PROPERTY(int minute READ minute NOTIFY timeChanged)
QML_NAMED_ELEMENT(Time)
//![0]
public:
TimeModel(QObject *parent=nullptr);
~TimeModel() override;
int minute() const { return timer->minute(); }
int hour() const { return timer->hour(); }
signals:
void timeChanged();
private:
QTime t;
static MinuteTimer *timer;
static int instances;
};
#endif // TIMEMODEL_H

View File

@ -1,4 +1,8 @@
QT = core qml QT = core qml
CONFIG += qmltypes
QML_IMPORT_NAME = People
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += main.cpp \ SOURCES += main.cpp \
person.cpp person.cpp

View File

@ -56,9 +56,6 @@
int main(int argc, char ** argv) int main(int argc, char ** argv)
{ {
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
//![0]
qmlRegisterTypesAndRevisions<Person>("People", 1);
//![0]
QQmlEngine engine; QQmlEngine engine;
QQmlComponent component(&engine, QUrl("qrc:example.qml")); QQmlComponent component(&engine, QUrl("qrc:example.qml"));

View File

@ -1,4 +1,8 @@
QT += qml QT += qml
CONFIG += qmltypes
QML_IMPORT_NAME = People
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += main.cpp \ SOURCES += main.cpp \
person.cpp \ person.cpp \

View File

@ -58,10 +58,6 @@ int main(int argc, char ** argv)
{ {
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
qmlRegisterTypesAndRevisions<BirthdayPartyAttached,
BirthdayParty, ShoeDescription,
Person, Boy, Girl>("People", 1);
QQmlEngine engine; QQmlEngine engine;
QQmlComponent component(&engine, QUrl("qrc:example.qml")); QQmlComponent component(&engine, QUrl("qrc:example.qml"));
auto *party = qobject_cast<BirthdayParty *>(component.create()); auto *party = qobject_cast<BirthdayParty *>(component.create());

View File

@ -1,5 +1,9 @@
QT += qml QT += qml
CONFIG += qmltypes
QML_IMPORT_NAME = People
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += main.cpp \ SOURCES += main.cpp \
person.cpp \ person.cpp \
birthdayparty.cpp \ birthdayparty.cpp \

View File

@ -55,6 +55,7 @@
#include <qqml.h> #include <qqml.h>
#include <QStringList> #include <QStringList>
#include <qqml.h>
class HappyBirthdaySong : public QObject, public QQmlPropertyValueSource class HappyBirthdaySong : public QObject, public QQmlPropertyValueSource
{ {

View File

@ -58,8 +58,6 @@
int main(int argc, char ** argv) int main(int argc, char ** argv)
{ {
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
qmlRegisterTypesAndRevisions<BirthdayPartyAttached, BirthdayParty, HappyBirthdaySong,
ShoeDescription, Person, Boy, Girl>("People", 1);
QQmlEngine engine; QQmlEngine engine;
QQmlComponent component(&engine, QUrl("qrc:example.qml")); QQmlComponent component(&engine, QUrl("qrc:example.qml"));

View File

@ -60,6 +60,7 @@ class BirthdayParty : public QObject
// ![0] // ![0]
Q_PROPERTY(Person *host READ host WRITE setHost) Q_PROPERTY(Person *host READ host WRITE setHost)
Q_PROPERTY(QQmlListProperty<Person> guests READ guests) Q_PROPERTY(QQmlListProperty<Person> guests READ guests)
QML_ELEMENT
// ![0] // ![0]
public: public:
BirthdayParty(QObject *parent = nullptr); BirthdayParty(QObject *parent = nullptr);

View File

@ -1,5 +1,9 @@
QT = core qml QT = core qml
CONFIG += qmltypes
QML_IMPORT_NAME = People
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += main.cpp \ SOURCES += main.cpp \
person.cpp \ person.cpp \
birthdayparty.cpp birthdayparty.cpp

View File

@ -58,10 +58,6 @@ int main(int argc, char ** argv)
{ {
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
//![0]
qmlRegisterTypesAndRevisions<BirthdayParty, Person, Boy, Girl>("People", 1);
//![0]
QQmlEngine engine; QQmlEngine engine;
QQmlComponent component(&engine, QUrl("qrc:example.qml")); QQmlComponent component(&engine, QUrl("qrc:example.qml"));
auto *party = qobject_cast<BirthdayParty *>(component.create()); auto *party = qobject_cast<BirthdayParty *>(component.create());

View File

@ -59,7 +59,8 @@ class Person : public QObject
Q_PROPERTY(QString name READ name WRITE setName) Q_PROPERTY(QString name READ name WRITE setName)
Q_PROPERTY(int shoeSize READ shoeSize WRITE setShoeSize) Q_PROPERTY(int shoeSize READ shoeSize WRITE setShoeSize)
//![0] //![0]
QML_ANONYMOUS QML_ELEMENT
QML_UNCREATABLE("Person is an abstract base class.")
//![0] //![0]
public: public:
Person(QObject *parent = nullptr); Person(QObject *parent = nullptr);

View File

@ -61,6 +61,7 @@ class BirthdayParty : public QObject
Q_PROPERTY(Person *host READ host WRITE setHost) Q_PROPERTY(Person *host READ host WRITE setHost)
Q_PROPERTY(QQmlListProperty<Person> guests READ guests) Q_PROPERTY(QQmlListProperty<Person> guests READ guests)
Q_CLASSINFO("DefaultProperty", "guests") Q_CLASSINFO("DefaultProperty", "guests")
QML_ELEMENT
public: public:
BirthdayParty(QObject *parent = nullptr); BirthdayParty(QObject *parent = nullptr);

View File

@ -1,5 +1,9 @@
QT = core qml QT = core qml
CONFIG += qmltypes
QML_IMPORT_NAME = People
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += main.cpp \ SOURCES += main.cpp \
person.cpp \ person.cpp \
birthdayparty.cpp birthdayparty.cpp

View File

@ -58,8 +58,6 @@ int main(int argc, char ** argv)
{ {
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
qmlRegisterTypesAndRevisions<BirthdayParty, Person, Boy, Girl>("People", 1);
QQmlEngine engine; QQmlEngine engine;
QQmlComponent component(&engine, QUrl("qrc:example.qml")); QQmlComponent component(&engine, QUrl("qrc:example.qml"));
auto *party = qobject_cast<BirthdayParty *>(component.create()); auto *party = qobject_cast<BirthdayParty *>(component.create());

View File

@ -1,5 +1,9 @@
QT += qml widgets QT += qml widgets
CONFIG += qmltypes
QML_IMPORT_NAME = People
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += main.cpp \ SOURCES += main.cpp \
lineedit.cpp lineedit.cpp
HEADERS += lineedit.h HEADERS += lineedit.h

View File

@ -51,6 +51,7 @@
#define LINEEDIT_H #define LINEEDIT_H
#include <QLineEdit> #include <QLineEdit>
#include <qqml.h>
class LineEditExtension : public QObject class LineEditExtension : public QObject
{ {
@ -80,4 +81,14 @@ private:
QLineEdit *m_lineedit; QLineEdit *m_lineedit;
}; };
// ![0]
struct QLineEditForeign
{
Q_GADGET
QML_FOREIGN(QLineEdit)
QML_ELEMENT
QML_EXTENDED(LineEditExtension)
};
// ![0]
#endif // LINEEDIT_H #endif // LINEEDIT_H

View File

@ -58,10 +58,6 @@ int main(int argc, char ** argv)
{ {
QApplication app(argc, argv); QApplication app(argc, argv);
// ![0]
qmlRegisterExtendedType<QLineEdit, LineEditExtension>("People", 1,0, "QLineEdit");
// ![0]
// ![1] // ![1]
QQmlEngine engine; QQmlEngine engine;
QQmlComponent component(&engine, QUrl("qrc:example.qml")); QQmlComponent component(&engine, QUrl("qrc:example.qml"));

View File

@ -60,6 +60,7 @@ class BirthdayParty : public QObject
Q_PROPERTY(Person *host READ host WRITE setHost) Q_PROPERTY(Person *host READ host WRITE setHost)
Q_PROPERTY(QQmlListProperty<Person> guests READ guests) Q_PROPERTY(QQmlListProperty<Person> guests READ guests)
Q_CLASSINFO("DefaultProperty", "guests") Q_CLASSINFO("DefaultProperty", "guests")
QML_ELEMENT
public: public:
BirthdayParty(QObject *parent = nullptr); BirthdayParty(QObject *parent = nullptr);

View File

@ -1,5 +1,9 @@
QT += qml QT += qml
CONFIG += qmltypes
QML_IMPORT_NAME = People
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += main.cpp \ SOURCES += main.cpp \
person.cpp \ person.cpp \
birthdayparty.cpp birthdayparty.cpp

View File

@ -58,8 +58,6 @@ int main(int argc, char ** argv)
{ {
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
qmlRegisterTypesAndRevisions<BirthdayParty, ShoeDescription, Person, Boy, Girl>("People", 1);
QQmlEngine engine; QQmlEngine engine;
QQmlComponent component(&engine, QUrl("qrc:example.qml")); QQmlComponent component(&engine, QUrl("qrc:example.qml"));
auto *party = qobject_cast<BirthdayParty *>(component.create()); auto *party = qobject_cast<BirthdayParty *>(component.create());

View File

@ -59,6 +59,7 @@ class BirthdayParty : public QObject
Q_OBJECT Q_OBJECT
Q_PROPERTY(Person *host READ host WRITE setHost) Q_PROPERTY(Person *host READ host WRITE setHost)
Q_PROPERTY(QQmlListProperty<Person> guests READ guests) Q_PROPERTY(QQmlListProperty<Person> guests READ guests)
QML_ELEMENT
public: public:
BirthdayParty(QObject *parent = nullptr); BirthdayParty(QObject *parent = nullptr);

View File

@ -58,8 +58,6 @@ int main(int argc, char ** argv)
{ {
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
qmlRegisterTypesAndRevisions<BirthdayParty, Person>("People", 1);
QQmlEngine engine; QQmlEngine engine;
QQmlComponent component(&engine, QUrl("qrc:example.qml")); QQmlComponent component(&engine, QUrl("qrc:example.qml"));
auto *party = qobject_cast<BirthdayParty *>(component.create()); auto *party = qobject_cast<BirthdayParty *>(component.create());

View File

@ -1,5 +1,9 @@
QT = core qml QT = core qml
CONFIG += qmltypes
QML_IMPORT_NAME = People
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += main.cpp \ SOURCES += main.cpp \
person.cpp \ person.cpp \
birthdayparty.cpp birthdayparty.cpp

View File

@ -67,6 +67,7 @@ class BirthdayParty : public QObject
Q_PROPERTY(QQmlListProperty<Person> guests READ guests) Q_PROPERTY(QQmlListProperty<Person> guests READ guests)
// ![2] // ![2]
// ![3] // ![3]
QML_ELEMENT
public: public:
BirthdayParty(QObject *parent = nullptr); BirthdayParty(QObject *parent = nullptr);

View File

@ -58,10 +58,6 @@ int main(int argc, char ** argv)
{ {
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
//![register list]
qmlRegisterTypesAndRevisions<BirthdayParty, Person>("People", 1);
//![register list]
QQmlEngine engine; QQmlEngine engine;
QQmlComponent component(&engine, QUrl("qrc:example.qml")); QQmlComponent component(&engine, QUrl("qrc:example.qml"));
auto *party = qobject_cast<BirthdayParty *>(component.create()); auto *party = qobject_cast<BirthdayParty *>(component.create());

View File

@ -1,5 +1,9 @@
QT = core qml QT = core qml
CONFIG += qmltypes
QML_IMPORT_NAME = People
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += main.cpp \ SOURCES += main.cpp \
person.cpp \ person.cpp \
birthdayparty.cpp birthdayparty.cpp

View File

@ -58,9 +58,6 @@ int main(int argc, char ** argv)
{ {
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
qmlRegisterTypesAndRevisions<BirthdayPartyAttached, BirthdayParty, ShoeDescription,
Person, Boy, Girl>("People", 1);
QQmlEngine engine; QQmlEngine engine;
QQmlComponent component(&engine, QUrl("qrc:example.qml")); QQmlComponent component(&engine, QUrl("qrc:example.qml"));
auto *party = qobject_cast<BirthdayParty *>(component.create()); auto *party = qobject_cast<BirthdayParty *>(component.create());

View File

@ -1,5 +1,9 @@
QT += qml QT += qml
CONFIG += qmltypes
QML_IMPORT_NAME = People
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += main.cpp \ SOURCES += main.cpp \
person.cpp \ person.cpp \
birthdayparty.cpp birthdayparty.cpp

View File

@ -64,6 +64,7 @@ class HappyBirthdaySong : public QObject, public QQmlPropertyValueSource
// ![0] // ![0]
Q_PROPERTY(QString name READ name WRITE setName) Q_PROPERTY(QString name READ name WRITE setName)
// ![1] // ![1]
QML_ELEMENT
public: public:
HappyBirthdaySong(QObject *parent = nullptr); HappyBirthdaySong(QObject *parent = nullptr);

View File

@ -59,9 +59,6 @@ int main(int argc, char ** argv)
{ {
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
qmlRegisterTypesAndRevisions<BirthdayPartyAttached, BirthdayParty, HappyBirthdaySong,
ShoeDescription, Person, Boy, Girl>("People", 1);
QQmlEngine engine; QQmlEngine engine;
QQmlComponent component(&engine, QUrl("qrc:example.qml")); QQmlComponent component(&engine, QUrl("qrc:example.qml"));
auto *party = qobject_cast<BirthdayParty *>(component.create()); auto *party = qobject_cast<BirthdayParty *>(component.create());

View File

@ -1,5 +1,9 @@
QT += qml QT += qml
CONFIG += qmltypes
QML_IMPORT_NAME = People
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += main.cpp \ SOURCES += main.cpp \
person.cpp \ person.cpp \
birthdayparty.cpp \ birthdayparty.cpp \

View File

@ -1,5 +1,9 @@
QT += qml quick QT += qml quick
CONFIG += qmltypes
QML_IMPORT_NAME = Charts
QML_IMPORT_MAJOR_VERSION = 1
HEADERS += piechart.h HEADERS += piechart.h
SOURCES += piechart.cpp \ SOURCES += piechart.cpp \
main.cpp main.cpp

View File

@ -56,8 +56,6 @@ int main(int argc, char *argv[])
{ {
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
qmlRegisterTypesAndRevisions<PieChart>("Charts", 1);
QQuickView view; QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView); view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:///app.qml")); view.setSource(QUrl("qrc:///app.qml"));

View File

@ -1,5 +1,9 @@
QT += qml quick QT += qml quick
CONFIG += qmltypes
QML_IMPORT_NAME = Charts
QML_IMPORT_MAJOR_VERSION = 1
HEADERS += piechart.h HEADERS += piechart.h
SOURCES += piechart.cpp \ SOURCES += piechart.cpp \
main.cpp main.cpp

View File

@ -56,8 +56,6 @@ int main(int argc, char *argv[])
{ {
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
qmlRegisterTypesAndRevisions<PieChart>("Charts", 1);
QQuickView view; QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView); view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:///app.qml")); view.setSource(QUrl("qrc:///app.qml"));

View File

@ -1,5 +1,9 @@
QT += qml quick QT += qml quick
CONFIG += qmltypes
QML_IMPORT_NAME = Charts
QML_IMPORT_MAJOR_VERSION = 1
HEADERS += piechart.h HEADERS += piechart.h
SOURCES += piechart.cpp \ SOURCES += piechart.cpp \
main.cpp main.cpp

View File

@ -56,8 +56,6 @@ int main(int argc, char *argv[])
{ {
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
qmlRegisterTypesAndRevisions<PieChart>("Charts", 1);
QQuickView view; QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView); view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:///app.qml")); view.setSource(QUrl("qrc:///app.qml"));

View File

@ -1,5 +1,9 @@
QT += qml quick QT += qml quick
CONFIG += qmltypes
QML_IMPORT_NAME = Charts
QML_IMPORT_MAJOR_VERSION = 1
HEADERS += piechart.h \ HEADERS += piechart.h \
pieslice.h pieslice.h
SOURCES += piechart.cpp \ SOURCES += piechart.cpp \

View File

@ -59,10 +59,6 @@ int main(int argc, char *argv[])
//![0] //![0]
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
//![1]
qmlRegisterTypesAndRevisions<PieChart, PieSlice>("Charts", 1);
//![1]
QQuickView view; QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView); view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:///app.qml")); view.setSource(QUrl("qrc:///app.qml"));

View File

@ -1,5 +1,9 @@
QT += qml quick QT += qml quick
CONFIG += qmltypes
QML_IMPORT_NAME = Charts
QML_IMPORT_MAJOR_VERSION = 1
HEADERS += piechart.h \ HEADERS += piechart.h \
pieslice.h pieslice.h
SOURCES += piechart.cpp \ SOURCES += piechart.cpp \

View File

@ -57,8 +57,6 @@ int main(int argc, char *argv[])
{ {
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
qmlRegisterTypesAndRevisions<PieChart, PieSlice>("Charts", 1);
QQuickView view; QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView); view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:///app.qml")); view.setSource(QUrl("qrc:///app.qml"));

View File

@ -53,13 +53,10 @@
//![0] //![0]
#include <QQmlExtensionPlugin> #include <QQmlExtensionPlugin>
class ChartsPlugin : public QQmlExtensionPlugin class ChartsPlugin : public QQmlEngineExtensionPlugin
{ {
Q_OBJECT Q_OBJECT
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid)
public:
void registerTypes(const char *uri);
}; };
//![0] //![0]

View File

@ -1,8 +1,11 @@
TEMPLATE = lib TEMPLATE = lib
CONFIG += plugin CONFIG += plugin qmltypes
QT += qml quick QT += qml quick
DESTDIR = ../Charts QML_IMPORT_NAME = Charts
QML_IMPORT_MAJOR_VERSION = 1
DESTDIR = ../$$QML_IMPORT_NAME
TARGET = $$qtLibraryTarget(chartsplugin) TARGET = $$qtLibraryTarget(chartsplugin)
HEADERS += piechart.h \ HEADERS += piechart.h \
@ -10,10 +13,13 @@ HEADERS += piechart.h \
chartsplugin.h chartsplugin.h
SOURCES += piechart.cpp \ SOURCES += piechart.cpp \
pieslice.cpp \ pieslice.cpp
chartsplugin.cpp
DESTPATH=$$[QT_INSTALL_EXAMPLES]/qml/tutorials/extending-qml/chapter6-plugins/Charts DESTPATH=$$[QT_INSTALL_EXAMPLES]/qml/tutorials/extending-qml/chapter6-plugins/$$QML_IMPORT_NAME
copy_qmltypes.files = $$OUT_PWD/plugins.qmltypes
copy_qmltypes.path = $$DESTDIR
COPIES += copy_qmltypes
target.path=$$DESTPATH target.path=$$DESTPATH
qmldir.files=$$PWD/qmldir qmldir.files=$$PWD/qmldir

View File

@ -53,14 +53,11 @@
#include "maskedmousearea.h" #include "maskedmousearea.h"
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
QGuiApplication app(argc,argv); QGuiApplication app(argc,argv);
QQuickView view; QQuickView view;
qmlRegisterTypesAndRevisions<MaskedMouseArea>("Example", 1);
view.setSource(QUrl("qrc:///customitems/maskedmousearea/maskedmousearea.qml")); view.setSource(QUrl("qrc:///customitems/maskedmousearea/maskedmousearea.qml"));
view.show(); view.show();
return app.exec(); return app.exec();

View File

@ -2,6 +2,10 @@ TEMPLATE = app
QT += quick qml QT += quick qml
CONFIG += qmltypes
QML_IMPORT_NAME = Example
QML_IMPORT_MAJOR_VERSION = 1
HEADERS += maskedmousearea.h HEADERS += maskedmousearea.h
SOURCES += main.cpp \ SOURCES += main.cpp \

View File

@ -52,13 +52,8 @@
#include "../textballoon.h" #include "../textballoon.h"
class TextBalloonPlugin : public QQmlExtensionPlugin class TextBalloonPlugin : public QQmlEngineExtensionPlugin
{ {
Q_OBJECT Q_OBJECT
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid)
public:
void registerTypes(const char *uri)
{
qmlRegisterTypesAndRevisions<TextBalloon>(uri, 1);
}
}; };

View File

@ -1,21 +1,25 @@
TEMPLATE = lib TEMPLATE = lib
CONFIG += plugin CONFIG += plugin qmltypes
QT += qml quick QT += qml quick
QML_IMPORT_NAME = TextBalloonPlugin
QML_IMPORT_MAJOR_VERSION = 1
TARGET = qmltextballoonplugin TARGET = qmltextballoonplugin
HEADERS += TextBalloonPlugin/plugin.h \ HEADERS += \
TextBalloonPlugin/plugin.h \
textballoon.h textballoon.h
SOURCES += textballoon.cpp SOURCES += textballoon.cpp
RESOURCES += painteditem.qrc RESOURCES += painteditem.qrc
DESTDIR = TextBalloonPlugin DESTDIR = $$QML_IMPORT_NAME
target.path = $$[QT_INSTALL_EXAMPLES]/quick/customitems/painteditem/TextBalloonPlugin target.path = $$[QT_INSTALL_EXAMPLES]/quick/customitems/painteditem/$$QML_IMPORT_NAME
qmldir.files = TextBalloonPlugin/qmldir qmldir.files = $$QML_IMPORT_NAME/qmldir
qmldir.path = $$[QT_INSTALL_EXAMPLES]/quick/customitems/painteditem/TextBalloonPlugin qmldir.path = $$[QT_INSTALL_EXAMPLES]/quick/customitems/painteditem/$$QML_IMPORT_NAME
INSTALLS += qmldir target INSTALLS += qmldir target

View File

@ -90,22 +90,16 @@ public:
}; };
class ImageProviderExtensionPlugin : public QQmlExtensionPlugin class ImageProviderExtensionPlugin : public QQmlEngineExtensionPlugin
{ {
Q_OBJECT Q_OBJECT
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid)
public: public:
void registerTypes(const char *uri) override
{
Q_UNUSED(uri);
}
void initializeEngine(QQmlEngine *engine, const char *uri) override void initializeEngine(QQmlEngine *engine, const char *uri) override
{ {
Q_UNUSED(uri); Q_UNUSED(uri);
engine->addImageProvider("colors", new ColorImageProvider); engine->addImageProvider("colors", new ColorImageProvider);
} }
}; };

View File

@ -128,16 +128,11 @@ private:
}; };
class ImageProviderExtensionPlugin : public QQmlExtensionPlugin class ImageProviderExtensionPlugin : public QQmlEngineExtensionPlugin
{ {
Q_OBJECT Q_OBJECT
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid)
public: public:
void registerTypes(const char *uri) override
{
Q_UNUSED(uri);
}
void initializeEngine(QQmlEngine *engine, const char *uri) override void initializeEngine(QQmlEngine *engine, const char *uri) override
{ {
Q_UNUSED(uri); Q_UNUSED(uri);

View File

@ -86,8 +86,6 @@ MainWindow::MainWindow(bool transparency, bool noRenderAlpha)
m_labelStatus = new QLabel; m_labelStatus = new QLabel;
layout->addWidget(m_labelStatus); layout->addWidget(m_labelStatus);
qmlRegisterTypesAndRevisions<FbItem>("fbitem", 1);
QWidget *quickContainer = new QWidget; QWidget *quickContainer = new QWidget;
layout->addWidget(quickContainer); layout->addWidget(quickContainer);
layout->setStretchFactor(quickContainer, 8); layout->setStretchFactor(quickContainer, 8);

View File

@ -1,6 +1,10 @@
TEMPLATE = app TEMPLATE = app
TARGET = qquickviewcomparison TARGET = qquickviewcomparison
CONFIG += qmltypes
QML_IMPORT_NAME = fbitem
QML_IMPORT_MAJOR_VERSION = 1
QT += quick widgets quickwidgets QT += quick widgets quickwidgets
SOURCES += main.cpp \ SOURCES += main.cpp \

View File

@ -214,8 +214,6 @@ int main(int argc, char **argv)
optMultipleSample = parser.isSet(multipleSampleOption); optMultipleSample = parser.isSet(multipleSampleOption);
optCoreProfile = parser.isSet(coreProfileOption); optCoreProfile = parser.isSet(coreProfileOption);
qmlRegisterTypesAndRevisions<FbItem>("QuickWidgetExample", 1);
MainWindow mainWindow; MainWindow mainWindow;
mainWindow.show(); mainWindow.show();

View File

@ -3,6 +3,10 @@ QT += core gui quick widgets quickwidgets
TARGET = quickwidget TARGET = quickwidget
TEMPLATE = app TEMPLATE = app
CONFIG += qmltypes
QML_IMPORT_NAME = QuickWidgetExample
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += main.cpp fbitem.cpp SOURCES += main.cpp fbitem.cpp
HEADERS += fbitem.h HEADERS += fbitem.h

View File

@ -64,7 +64,9 @@ class BezierCurve : public QQuickItem
Q_PROPERTY(QPointF p4 READ p4 WRITE setP4 NOTIFY p4Changed) Q_PROPERTY(QPointF p4 READ p4 WRITE setP4 NOTIFY p4Changed)
Q_PROPERTY(int segmentCount READ segmentCount WRITE setSegmentCount NOTIFY segmentCountChanged) Q_PROPERTY(int segmentCount READ segmentCount WRITE setSegmentCount NOTIFY segmentCountChanged)
//! [3]
QML_ELEMENT QML_ELEMENT
//! [3]
public: public:
BezierCurve(QQuickItem *parent = 0); BezierCurve(QQuickItem *parent = 0);

View File

@ -1,6 +1,10 @@
TARGET = customgeometry TARGET = customgeometry
QT += quick QT += quick
CONFIG += qmltypes
QML_IMPORT_NAME = CustomGeometry
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += \ SOURCES += \
main.cpp \ main.cpp \
beziercurve.cpp beziercurve.cpp

View File

@ -169,11 +169,16 @@
\snippet scenegraph/customgeometry/main.cpp 1 \snippet scenegraph/customgeometry/main.cpp 1
The application is a straightforward QML application, with a The application is a straightforward QML application, with a
QGuiApplication and a QQuickView that we pass a .qml file. To make QGuiApplication and a QQuickView that we pass a .qml file.
use of the BezierCurve item, we need to register it in the QML
engine, using the qmlRegisterType() function. We give it the name \snippet scenegraph/customgeometry/beziercurve.h 3
BezierCurve and make it part of the \c {CustomGeometry 1.0}
module. To make use of the BezierCurve item, we need to register it in the QML
engine, using the QML_ELEMENT macro. This gives it the name
BezierCurve and makes it part of the \c {CustomGeometry 1.0}
module as defined in the customgeometry.pro file:
\quotefile scenegraph/customgeometry/customgeometry.pro
As the bezier curve is drawn using GL_LINE_STRIP, we specify that As the bezier curve is drawn using GL_LINE_STRIP, we specify that
the view should be multisampled to get antialiasing. This is not the view should be multisampled to get antialiasing. This is not

View File

@ -58,8 +58,6 @@ int main(int argc, char **argv)
{ {
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
qmlRegisterTypesAndRevisions<BezierCurve>("CustomGeometry", 1);
QQuickView view; QQuickView view;
QSurfaceFormat format = view.format(); QSurfaceFormat format = view.format();
format.setSamples(16); format.setSamples(16);

View File

@ -2,6 +2,10 @@
QT += qml quick QT += qml quick
CONFIG += qmltypes
QML_IMPORT_NAME = D3D11UnderQML
QML_IMPORT_MAJOR_VERSION = 1
HEADERS += d3d11squircle.h HEADERS += d3d11squircle.h
SOURCES += d3d11squircle.cpp main.cpp SOURCES += d3d11squircle.cpp main.cpp
RESOURCES += d3d11underqml.qrc RESOURCES += d3d11underqml.qrc

View File

@ -56,8 +56,6 @@ int main(int argc, char **argv)
{ {
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
qmlRegisterTypesAndRevisions<D3D11Squircle>("D3D11UnderQML", 1);
QQuickWindow::setSceneGraphBackend(QSGRendererInterface::Direct3D11Rhi); QQuickWindow::setSceneGraphBackend(QSGRendererInterface::Direct3D11Rhi);
QQuickView view; QQuickView view;

View File

@ -1,5 +1,9 @@
QT += qml quick QT += qml quick
CONFIG += qmltypes
QML_IMPORT_NAME = SceneGraphRendering
QML_IMPORT_MAJOR_VERSION = 1
HEADERS += fboinsgrenderer.h HEADERS += fboinsgrenderer.h
SOURCES += fboinsgrenderer.cpp main.cpp SOURCES += fboinsgrenderer.cpp main.cpp

View File

@ -58,8 +58,6 @@ int main(int argc, char **argv)
{ {
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
qmlRegisterTypesAndRevisions<FboInSGRenderer>("SceneGraphRendering", 1);
QQuickView view; QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView); view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:///scenegraph/fboitem/main.qml")); view.setSource(QUrl("qrc:///scenegraph/fboitem/main.qml"));

View File

@ -4,6 +4,10 @@ TARGET = graph
TEMPLATE = app TEMPLATE = app
CONFIG += qmltypes
QML_IMPORT_NAME = Graph
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += main.cpp \ SOURCES += main.cpp \
graph.cpp \ graph.cpp \
noisynode.cpp \ noisynode.cpp \

View File

@ -58,8 +58,6 @@ int main(int argc, char *argv[])
{ {
QGuiApplication a(argc, argv); QGuiApplication a(argc, argv);
qmlRegisterTypesAndRevisions<Graph>("Graph", 1);
QQuickView view; QQuickView view;
view.resize(800, 400); view.resize(800, 400);
view.setResizeMode(QQuickView::SizeRootObjectToView); view.setResizeMode(QQuickView::SizeRootObjectToView);

View File

@ -56,8 +56,6 @@ int main(int argc, char **argv)
{ {
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
qmlRegisterTypesAndRevisions<MetalSquircle>("MetalUnderQML", 1);
QQuickWindow::setSceneGraphBackend(QSGRendererInterface::MetalRhi); QQuickWindow::setSceneGraphBackend(QSGRendererInterface::MetalRhi);
QQuickView view; QQuickView view;

View File

@ -2,6 +2,10 @@
QT += qml quick QT += qml quick
CONFIG += qmltypes
QML_IMPORT_NAME = MetalUnderQML
QML_IMPORT_MAJOR_VERSION = 1
HEADERS += metalsquircle.h HEADERS += metalsquircle.h
SOURCES += metalsquircle.mm main.cpp SOURCES += metalsquircle.mm main.cpp
RESOURCES += metalunderqml.qrc RESOURCES += metalunderqml.qrc

View File

@ -60,6 +60,7 @@
First of all, we need an object we can expose to QML. This is a First of all, we need an object we can expose to QML. This is a
subclass of QQuickItem so we can easily access \l QQuickItem::window(). subclass of QQuickItem so we can easily access \l QQuickItem::window().
We expose it to QML using the QML_ELEMENT macro.
\snippet scenegraph/openglunderqml/squircle.h 1 \snippet scenegraph/openglunderqml/squircle.h 1
@ -145,9 +146,7 @@
\snippet scenegraph/openglunderqml/main.cpp 1 \snippet scenegraph/openglunderqml/main.cpp 1
The application's \c main() function instantiates a QQuickView and The application's \c main() function instantiates a QQuickView and
launches the \c main.qml file. The only thing worth noting is that launches the \c main.qml file.
we export the \c Squircle class to QML using the \l
qmlRegisterType() macro.
\snippet scenegraph/openglunderqml/main.qml 1 \snippet scenegraph/openglunderqml/main.qml 1

View File

@ -59,8 +59,6 @@ int main(int argc, char **argv)
{ {
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
qmlRegisterTypesAndRevisions<Squircle>("OpenGLUnderQML", 1);
QQuickView view; QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView); view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:///scenegraph/openglunderqml/main.qml")); view.setSource(QUrl("qrc:///scenegraph/openglunderqml/main.qml"));

View File

@ -1,5 +1,9 @@
QT += qml quick QT += qml quick
CONFIG += qmltypes
QML_IMPORT_NAME = OpenGLUnderQML
QML_IMPORT_MAJOR_VERSION = 1
HEADERS += squircle.h HEADERS += squircle.h
SOURCES += squircle.cpp main.cpp SOURCES += squircle.cpp main.cpp
RESOURCES += openglunderqml.qrc RESOURCES += openglunderqml.qrc

View File

@ -53,6 +53,7 @@
#include <QQuickItem> #include <QQuickItem>
//! [0]
class CustomRenderItem : public QQuickItem class CustomRenderItem : public QQuickItem
{ {
Q_OBJECT Q_OBJECT
@ -62,5 +63,6 @@ public:
CustomRenderItem(QQuickItem *parent = nullptr); CustomRenderItem(QQuickItem *parent = nullptr);
QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *) override; QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *) override;
}; };
//! [0]
#endif #endif

View File

@ -69,7 +69,7 @@
Let's go through the most important parts of the code: Let's go through the most important parts of the code:
\snippet scenegraph/rendernode/main.cpp 1 \snippet scenegraph/rendernode/customrenderitem.h 0
Our custom QML type is implemented in the class CustomRenderItem. Our custom QML type is implemented in the class CustomRenderItem.

View File

@ -58,10 +58,6 @@ int main(int argc, char **argv)
{ {
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
//! [1]
qmlRegisterTypesAndRevisions<CustomRenderItem>("SceneGraphRendering", 2);
//! [1]
QQuickView view; QQuickView view;
QCoreApplication::setApplicationName("Qt Scene Graph Render Node Example"); QCoreApplication::setApplicationName("Qt Scene Graph Render Node Example");

View File

@ -1,5 +1,9 @@
QT += qml quick QT += qml quick
CONFIG += qmltypes
QML_IMPORT_NAME = SceneGraphRendering
QML_IMPORT_MAJOR_VERSION = 2
HEADERS += customrenderitem.h \ HEADERS += customrenderitem.h \
openglrenderer.h \ openglrenderer.h \
softwarerenderer.h softwarerenderer.h

View File

@ -47,7 +47,7 @@
material state is what we assign to each individual node; in this material state is what we assign to each individual node; in this
case to give them different colors. case to give them different colors.
\snippet scenegraph/simplematerial/simplematerial.cpp 1 \snippet scenegraph/simplematerial/simplematerialitem.cpp 1
The first thing we do when creating custom materials with the The first thing we do when creating custom materials with the
simplified scheme is to create a state class. In this case the simplified scheme is to create a state class. In this case the
@ -55,7 +55,7 @@
compare function which the scene graph can use to reorder the node compare function which the scene graph can use to reorder the node
rendering. rendering.
\snippet scenegraph/simplematerial/simplematerial.cpp 2 \snippet scenegraph/simplematerial/simplematerialitem.cpp 2
Next we define the material shader, by subclassing a template Next we define the material shader, by subclassing a template
instantiation of \l QSGSimpleMaterialShader with our \c State. instantiation of \l QSGSimpleMaterialShader with our \c State.
@ -74,21 +74,21 @@
classes. Using the same \c State class in multiple shaders will classes. Using the same \c State class in multiple shaders will
will lead to undefined behavior. will lead to undefined behavior.
\snippet scenegraph/simplematerial/simplematerial.cpp 3 \snippet scenegraph/simplematerial/simplematerialitem.cpp 3
Next comes the declaration of the shader source code, where we Next comes the declaration of the shader source code, where we
define a vertex and fragment shader. The simple material assumes define a vertex and fragment shader. The simple material assumes
the presence of \c qt_Matrix in the vertex shader and \c the presence of \c qt_Matrix in the vertex shader and \c
qt_Opacity in the fragment shader. qt_Opacity in the fragment shader.
\snippet scenegraph/simplematerial/simplematerial.cpp 4 \snippet scenegraph/simplematerial/simplematerialitem.cpp 4
We reimplement the \c attributes function to return the name of We reimplement the \c attributes function to return the name of
the \c aVertex and \c aTexCoord attributes. These attributes the \c aVertex and \c aTexCoord attributes. These attributes
will be mapped to attribute indices 0 and 1 in the node's will be mapped to attribute indices 0 and 1 in the node's
geometry. geometry.
\snippet scenegraph/simplematerial/simplematerial.cpp 6 \snippet scenegraph/simplematerial/simplematerialitem.cpp 6
Uniforms can be accessed either by name or by index, where index Uniforms can be accessed either by name or by index, where index
is faster than name. We reimplement the \c resolveUniforms() is faster than name. We reimplement the \c resolveUniforms()
@ -96,7 +96,7 @@
to worry about resolving \c qt_Opacity or \c qt_Matrix as these to worry about resolving \c qt_Opacity or \c qt_Matrix as these
are handled by the baseclass. are handled by the baseclass.
\snippet scenegraph/simplematerial/simplematerial.cpp 5 \snippet scenegraph/simplematerial/simplematerialitem.cpp 5
The \c updateState() function is called once for every unique The \c updateState() function is called once for every unique
state and we use it to update the shader program with the current state and we use it to update the shader program with the current
@ -105,7 +105,7 @@
use case, where all the colors are different, the updateState() use case, where all the colors are different, the updateState()
function will be called once for every node. function will be called once for every node.
\snippet scenegraph/simplematerial/simplematerial.cpp 7 \snippet scenegraph/simplematerial/simplematerialitem.cpp 7
The \c ColorNode class is supposed to draw something, so it needs The \c ColorNode class is supposed to draw something, so it needs
to be a subclass of \l QSGGeometryNode. to be a subclass of \l QSGGeometryNode.
@ -129,12 +129,13 @@
Finally, we tell the node to take ownership of the material, so we Finally, we tell the node to take ownership of the material, so we
do not have to explicitly memory-manage it. do not have to explicitly memory-manage it.
\snippet scenegraph/simplematerial/simplematerial.cpp 8 \snippet scenegraph/simplematerial/simplematerialitem.h 8
Since the Item is providing its own graphics to the scene graph, Since the Item is providing its own graphics to the scene graph,
we set the flag \l QQuickItem::ItemHasContents. we set the flag \l QQuickItem::ItemHasContents. We also make sure
the item is exposed to QML by adding the QML_ELEMENT macro.
\snippet scenegraph/simplematerial/simplematerial.cpp 9 \snippet scenegraph/simplematerial/simplematerialitem.cpp 9
Whenever the Item has changed graphically, the \l Whenever the Item has changed graphically, the \l
QQuickItem::updatePaintNode() function is called. QQuickItem::updatePaintNode() function is called.
@ -159,9 +160,8 @@
\snippet scenegraph/simplematerial/simplematerial.cpp 11 \snippet scenegraph/simplematerial/simplematerial.cpp 11
The \c main() function of the application adds the custom QML type The \c main() function of the application opens up a \l QQuickView
using \l qmlRegisterType() and opens up a \l QQuickView with our with our QML file.
QML file.
\snippet scenegraph/simplematerial/main.qml 1 \snippet scenegraph/simplematerial/main.qml 1

View File

@ -49,163 +49,13 @@
****************************************************************************/ ****************************************************************************/
#include <qguiapplication.h> #include <qguiapplication.h>
#include <qsgmaterial.h>
#include <qsgnode.h>
#include <qquickitem.h>
#include <qquickview.h> #include <qquickview.h>
#include <qsgsimplerectnode.h> //! [11]
#include <qsgsimplematerial.h>
//! [1]
struct State
{
QColor color;
int compare(const State *other) const {
uint rgb = color.rgba();
uint otherRgb = other->color.rgba();
if (rgb == otherRgb) {
return 0;
} else if (rgb < otherRgb) {
return -1;
} else {
return 1;
}
}
};
//! [1]
//! [2]
class Shader : public QSGSimpleMaterialShader<State>
{
QSG_DECLARE_SIMPLE_COMPARABLE_SHADER(Shader, State);
//! [2] //! [3]
public:
const char *vertexShader() const override {
return
"attribute highp vec4 aVertex; \n"
"attribute highp vec2 aTexCoord; \n"
"uniform highp mat4 qt_Matrix; \n"
"varying highp vec2 texCoord; \n"
"void main() { \n"
" gl_Position = qt_Matrix * aVertex; \n"
" texCoord = aTexCoord; \n"
"}";
}
const char *fragmentShader() const override {
return
"uniform lowp float qt_Opacity; \n"
"uniform lowp vec4 color; \n"
"varying highp vec2 texCoord; \n"
"void main () \n"
"{ \n"
" gl_FragColor = texCoord.y * texCoord.x * color * qt_Opacity; \n"
"}";
}
//! [3] //! [4]
QList<QByteArray> attributes() const override
{
return QList<QByteArray>() << "aVertex" << "aTexCoord";
}
//! [4] //! [5]
void updateState(const State *state, const State *) override
{
program()->setUniformValue(id_color, state->color);
}
//! [5] //! [6]
void resolveUniforms() override
{
id_color = program()->uniformLocation("color");
}
private:
int id_color;
//! [6]
};
//! [7]
class ColorNode : public QSGGeometryNode
{
public:
ColorNode()
: m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4)
{
setGeometry(&m_geometry);
QSGSimpleMaterial<State> *material = Shader::createMaterial();
material->setFlag(QSGMaterial::Blending);
setMaterial(material);
setFlag(OwnsMaterial);
}
QSGGeometry m_geometry;
};
//! [7]
//! [8]
class Item : public QQuickItem
{
Q_OBJECT
Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
QML_NAMED_ELEMENT(SimpleMaterialItem)
public:
Item()
{
setFlag(ItemHasContents, true);
}
void setColor(const QColor &color) {
if (m_color != color) {
m_color = color;
emit colorChanged();
update();
}
}
QColor color() const {
return m_color;
}
signals:
void colorChanged();
private:
QColor m_color;
//! [8] //! [9]
public:
QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *) override
{
ColorNode *n = static_cast<ColorNode *>(node);
if (!node)
n = new ColorNode();
QSGGeometry::updateTexturedRectGeometry(n->geometry(), boundingRect(), QRectF(0, 0, 1, 1));
static_cast<QSGSimpleMaterial<State>*>(n->material())->state()->color = m_color;
n->markDirty(QSGNode::DirtyGeometry | QSGNode::DirtyMaterial);
return n;
}
};
//! [9] //! [11]
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
qmlRegisterTypesAndRevisions<Item>("SimpleMaterial", 1);
QQuickView view; QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView); view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:///scenegraph/simplematerial/main.qml")); view.setSource(QUrl("qrc:///scenegraph/simplematerial/main.qml"));
@ -213,6 +63,4 @@ int main(int argc, char **argv)
return app.exec(); return app.exec();
} }
#include "simplematerial.moc"
//! [11] //! [11]

View File

@ -1,8 +1,13 @@
QT += quick QT += quick
CONFIG += qmltypes
QML_IMPORT_NAME = SimpleMaterial
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += \ SOURCES += \
simplematerial.cpp simplematerial.cpp \
simplematerialitem.cpp
RESOURCES += simplematerial.qrc RESOURCES += simplematerial.qrc
target.path = $$[QT_INSTALL_EXAMPLES]/quick/scenegraph/simplematerial target.path = $$[QT_INSTALL_EXAMPLES]/quick/scenegraph/simplematerial
@ -10,3 +15,6 @@ qml.files = main.qml
qml.path = $$[QT_INSTALL_EXAMPLES]/quick/scenegraph/simplematerial qml.path = $$[QT_INSTALL_EXAMPLES]/quick/scenegraph/simplematerial
INSTALLS += target qml INSTALLS += target qml
HEADERS += \
simplematerialitem.h

View File

@ -0,0 +1,169 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the demonstration applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, 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 The Qt Company Ltd 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 "simplematerialitem.h"
#include <QtQuick/qsgsimplematerial.h>
#include <QtQuick/qsggeometry.h>
#include <QtQuick/qsgnode.h>
//! [1]
struct State
{
QColor color;
int compare(const State *other) const {
uint rgb = color.rgba();
uint otherRgb = other->color.rgba();
if (rgb == otherRgb) {
return 0;
} else if (rgb < otherRgb) {
return -1;
} else {
return 1;
}
}
};
//! [1]
//! [2]
class Shader : public QSGSimpleMaterialShader<State>
{
QSG_DECLARE_SIMPLE_COMPARABLE_SHADER(Shader, State);
//! [2] //! [3]
public:
const char *vertexShader() const override {
return
"attribute highp vec4 aVertex; \n"
"attribute highp vec2 aTexCoord; \n"
"uniform highp mat4 qt_Matrix; \n"
"varying highp vec2 texCoord; \n"
"void main() { \n"
" gl_Position = qt_Matrix * aVertex; \n"
" texCoord = aTexCoord; \n"
"}";
}
const char *fragmentShader() const override {
return
"uniform lowp float qt_Opacity; \n"
"uniform lowp vec4 color; \n"
"varying highp vec2 texCoord; \n"
"void main () \n"
"{ \n"
" gl_FragColor = texCoord.y * texCoord.x * color * qt_Opacity; \n"
"}";
}
//! [3] //! [4]
QList<QByteArray> attributes() const override
{
return QList<QByteArray>() << "aVertex" << "aTexCoord";
}
//! [4] //! [5]
void updateState(const State *state, const State *) override
{
program()->setUniformValue(id_color, state->color);
}
//! [5] //! [6]
void resolveUniforms() override
{
id_color = program()->uniformLocation("color");
}
private:
int id_color;
//! [6]
};
//! [7]
class ColorNode : public QSGGeometryNode
{
public:
ColorNode()
: m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4)
{
setGeometry(&m_geometry);
QSGSimpleMaterial<State> *material = Shader::createMaterial();
material->setFlag(QSGMaterial::Blending);
setMaterial(material);
setFlag(OwnsMaterial);
}
QSGGeometry m_geometry;
};
//! [7]
void SimpleMaterialItem::setColor(const QColor &color) {
if (m_color != color) {
m_color = color;
emit colorChanged();
update();
}
}
//! [9]
QSGNode *SimpleMaterialItem::updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNodeData *)
{
ColorNode *n = static_cast<ColorNode *>(node);
if (!node)
n = new ColorNode();
QSGGeometry::updateTexturedRectGeometry(n->geometry(), boundingRect(), QRectF(0, 0, 1, 1));
static_cast<QSGSimpleMaterial<State>*>(n->material())->state()->color = m_color;
n->markDirty(QSGNode::DirtyGeometry | QSGNode::DirtyMaterial);
return n;
}
//! [9]

View File

@ -1,9 +1,9 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2017 The Qt Company Ltd. ** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the documentation of the Qt Toolkit. ** This file is part of the demonstration applications of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:BSD$ ** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage ** Commercial License Usage
@ -47,16 +47,36 @@
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
#include "chartsplugin.h"
//![0]
#include "piechart.h"
#include "pieslice.h"
#include <qqml.h>
void ChartsPlugin::registerTypes(const char *uri) #ifndef SIMPLEMATERIALITEM_H
#define SIMPLEMATERIALITEM_H
#include <QtQuick/qquickitem.h>
//! [8]
class SimpleMaterialItem : public QQuickItem
{ {
qmlRegisterTypesAndRevisions<PieChart, PieSlice>(uri, 1); Q_OBJECT
}
//![0] Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
QML_ELEMENT
public:
SimpleMaterialItem() { setFlag(ItemHasContents, true); }
void setColor(const QColor &color);
QColor color() const { return m_color; }
signals:
void colorChanged();
private:
QColor m_color;
public:
QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *) override;
};
//! [8]
#endif // SIMPLEMATERIALITEM_H

View File

@ -70,7 +70,6 @@ int main(int argc, char **argv)
return app.exec(); return app.exec();
} }
qmlRegisterTypesAndRevisions<ThreadRenderer>("SceneGraphRendering", 1);
int execReturn = 0; int execReturn = 0;
{ {

View File

@ -3,6 +3,10 @@ QT += quick
# To make threaded gl check... # To make threaded gl check...
QT += core-private gui-private QT += core-private gui-private
CONFIG += qmltypes
QML_IMPORT_NAME = SceneGraphRendering
QML_IMPORT_MAJOR_VERSION = 1
HEADERS += threadrenderer.h HEADERS += threadrenderer.h
SOURCES += threadrenderer.cpp main.cpp SOURCES += threadrenderer.cpp main.cpp

View File

@ -57,8 +57,6 @@ int main(int argc, char **argv)
{ {
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
qmlRegisterTypesAndRevisions<Spinner>("Spinner", 1);
QQuickView view; QQuickView view;
view.setSource(QUrl("qrc:///scenegraph/threadedanimation/main.qml")); view.setSource(QUrl("qrc:///scenegraph/threadedanimation/main.qml"));
view.show(); view.show();

View File

@ -1,5 +1,9 @@
QT += qml quick QT += qml quick
CONFIG += qmltypes
QML_IMPORT_NAME = Spinner
QML_IMPORT_MAJOR_VERSION = 1
HEADERS += spinner.h HEADERS += spinner.h
SOURCES += spinner.cpp main.cpp SOURCES += spinner.cpp main.cpp
RESOURCES += threadedanimation.qrc RESOURCES += threadedanimation.qrc

View File

@ -58,8 +58,6 @@ int main(int argc, char **argv)
{ {
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
qmlRegisterTypesAndRevisions<XorBlender>("SceneGraphRendering", 1);
QQuickView view; QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView); view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:///scenegraph/twotextureproviders/main.qml")); view.setSource(QUrl("qrc:///scenegraph/twotextureproviders/main.qml"));

View File

@ -1,5 +1,9 @@
QT += qml quick QT += qml quick
CONFIG += qmltypes
QML_IMPORT_NAME = SceneGraphRendering
QML_IMPORT_MAJOR_VERSION = 1
HEADERS += xorblender.h HEADERS += xorblender.h
SOURCES += xorblender.cpp main.cpp SOURCES += xorblender.cpp main.cpp

View File

@ -50,9 +50,6 @@
the view should be scrolled to. the view should be scrolled to.
\snippet tableview/gameoflife/main.qml model \snippet tableview/gameoflife/main.qml model
The model that we use is a custom C++ class that we register
in the QML system:
\snippet tableview/gameoflife/main.cpp registertype
\section1 The C++ Model \section1 The C++ Model
@ -61,7 +58,8 @@
used as the model of our TableView component. Therefore, it needs to used as the model of our TableView component. Therefore, it needs to
implement some functions so the TableView component can interact with implement some functions so the TableView component can interact with
the model. As you can see in the \c private part of the class, the model the model. As you can see in the \c private part of the class, the model
uses a fixed-size array to store the current state of all the cells. uses a fixed-size array to store the current state of all the cells. We
also use the QML_ELEMENT macro in order to expose the class to QML.
\snippet tableview/gameoflife/gameoflifemodel.cpp modelsize \snippet tableview/gameoflife/gameoflifemodel.cpp modelsize
Here, the \c rowCount and \c columnCount methods are implemented so Here, the \c rowCount and \c columnCount methods are implemented so

View File

@ -1,6 +1,11 @@
TEMPLATE = app TEMPLATE = app
QT += quick qml QT += quick qml
CONFIG += qmltypes
QML_IMPORT_NAME = GameOfLifeModel
QML_IMPORT_MAJOR_VERSION = 1
SOURCES += \ SOURCES += \
main.cpp \ main.cpp \
gameoflifemodel.cpp gameoflifemodel.cpp

View File

@ -58,10 +58,6 @@ int main(int argc, char *argv[])
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
QQmlApplicationEngine engine; QQmlApplicationEngine engine;
//! [registertype]
qmlRegisterTypesAndRevisions<GameOfLifeModel>("GameOfLifeModel", 1);
//! [registertype]
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty()) if (engine.rootObjects().isEmpty())
return -1; return -1;

View File

@ -42,6 +42,7 @@
TableView. TableView.
We use the \l{The Property System}{Qt Property System} and a source property We use the \l{The Property System}{Qt Property System} and a source property
as \c QString to set the path of the image. as \c QString to set the path of the image.
We also add the QML_ELEMENT macro to expose the model to QML.
\snippet tableview/pixelator/imagemodel.cpp setsource \snippet tableview/pixelator/imagemodel.cpp setsource
@ -59,11 +60,6 @@
When we call this function with the display role, we return the pixel's When we call this function with the display role, we return the pixel's
gray value. gray value.
\snippet tableview/pixelator/main.cpp registertype
We need to register our model in the QML type system to be able to use it
from the QML side.
\snippet tableview/pixelator/main.qml pixelcomponent \snippet tableview/pixelator/main.qml pixelcomponent
Each pixel in the \c TableView is displayed via a delegate component. Each pixel in the \c TableView is displayed via a delegate component.

View File

@ -59,10 +59,6 @@ int main(int argc, char *argv[])
QQmlApplicationEngine engine; QQmlApplicationEngine engine;
//! [registertype]
qmlRegisterTypesAndRevisions<ImageModel>("ImageModel", 1);
//! [registertype]
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty()) if (engine.rootObjects().isEmpty())
return -1; return -1;

View File

@ -5,6 +5,10 @@ HEADERS += imagemodel.h
SOURCES += main.cpp \ SOURCES += main.cpp \
imagemodel.cpp imagemodel.cpp
CONFIG += qmltypes
QML_IMPORT_NAME = ImageModel
QML_IMPORT_MAJOR_VERSION = 1
RESOURCES += qt.png main.qml RESOURCES += qt.png main.qml
target.path = $$[QT_INSTALL_EXAMPLES]/quick/tableview/pixelator target.path = $$[QT_INSTALL_EXAMPLES]/quick/tableview/pixelator

View File

@ -133,10 +133,9 @@ Here is the application \c main.cpp:
\snippet tutorials/extending-qml/chapter1-basics/main.cpp 0 \snippet tutorials/extending-qml/chapter1-basics/main.cpp 0
This call to qmlRegisterType() registers the \c PieChart type as a type called "PieChart", We write a \c .pro project file that includes the files and the \c qml library, and
in a type namespace called "Charts", with a version of 1.0. defines a type namespace called "Charts" with a version of 1.0 for any types exposed
to QML:
Lastly, we write a \c .pro project file that includes the files and the \c declarative library:
\quotefile tutorials/extending-qml/chapter1-basics/chapter1-basics.pro \quotefile tutorials/extending-qml/chapter1-basics/chapter1-basics.pro
@ -314,15 +313,13 @@ item when its contents are drawn:
\snippet tutorials/extending-qml/chapter4-customPropertyTypes/piechart.cpp 0 \snippet tutorials/extending-qml/chapter4-customPropertyTypes/piechart.cpp 0
Like the \c PieChart type, the \c PieSlice type has to be registered Like the \c PieChart type, the \c PieSlice type has to be exposted to QML
using qmlRegisterType() to be used from QML. As with \c PieChart, we'll add the using QML_ELEMENT. As with \c PieChart, we add the "Charts" type namespace,
type to the "Charts" type namespace, version 1.0: version 1.0 to the .pro file:
\snippet tutorials/extending-qml/chapter4-customPropertyTypes/main.cpp 0 \snippet tutorials/extending-qml/chapter4-customPropertyTypes/pieslice.h 0
\dots \dots
\snippet tutorials/extending-qml/chapter4-customPropertyTypes/main.cpp 1 \quotefile tutorials/extending-qml/chapter1-basics/chapter4-customPropertyTypes.pro
\dots
\snippet tutorials/extending-qml/chapter4-customPropertyTypes/main.cpp 2
The source code from the following files are referred to in this chapter: The source code from the following files are referred to in this chapter:
\generatelist examplefiles .*chapter4.* \generatelist examplefiles .*chapter4.*

View File

@ -29,7 +29,7 @@ Suppose there is a new \c TimeModel C++ class that should be made available
as a new QML type. It provides the current time through \c hour and \c minute as a new QML type. It provides the current time through \c hour and \c minute
properties. properties.
\snippet qmlextensionplugins/plugin.cpp 0 \snippet qmlextensionplugins/timemodel.h 0
\dots \dots
To make this type available, we create a plugin class named \c QExampleQmlPlugin To make this type available, we create a plugin class named \c QExampleQmlPlugin