/*!
\page cppitem.html
\target cppitem
\title C++ Components
\section1 Making a C++ object available in QML
In QML, the item types and properties correspond to Qt objects and properties. Thus, any Qt object
can potentially be used as an item in QML. More specifically, to make an object available in QML,
it should:
\list
\o Be a subclass of QObject.
\o Provide a default constructor.
\o Declare Q_PROPERTYs.
\o Be registered via the QML_DECLARE_TYPE and QML_DEFINE_TYPE macros.
\endlist
\section2 Declaring Q_PROPERTYs
\target properties
Properties of QObject subclasses are available as properties in QML.
Like any QObject, these properties are defined by the Q_PROPERTY
macro in the header file.
Properties should have a NOTIFY function if they can change dynamically and
if any useful response could be made to them changing in another object. Almost
all properties will thus need a NOTIFY function.
\code
Q_PROPERTY(qreal scale READ scale WRITE setScale NOTIFY scaleChanged);
qreal scale() const;
void setScale(qreal);
...
signals: void scaleChanged();
\endcode
The property types currently supported by QML are:
\list
\o int
\o qreal
\o QString
\o QColor
\o QDate, QTime, and QDateTime
\o QSize and QSizeF
\o QPoint and QPointF
\o QRect and QRectF
\o QPixmap
\o QIcon
\o enums registered with Q_ENUMS
\o flags registered with Q_FLAGS
\o QVariant
\o QObject* (or subclass)
\endlist
Custom property types that provide string-to-type conversion can be used as well, by:
\list
\o Registering them as a metatype (Q_DECLARE_METATYPE() and qRegisterMetaType())
\o Registering a string-to-type convertor function (QML::addCustomStringConvertor()).
\endlist
\section2 Registering your type
\target register
In order for your type to be usable in QML, you must register it:
\code
QML_DECLARE_TYPE(TypeName);
QML_DEFINE_TYPE(TypeName,QmlName);
\endcode
These macros make the C++ \e TypeName available from the declarative markup language under the name \e QmlName.
Of course there's nothing stopping you using the same name for both the C++ and the QML name!
For example:
\code
QML_DECLARE_TYPE(MyCircle);
QML_DEFINE_TYPE(MyCircle,Circle);
\endcode
would make the \e MyCircle class accessable though the \c Circle type in QML.
\section1 Creating a new 'Fx' item in C++
You can create a new type of 'Fx' item by:
\list 1
\o Creating a subclass of QFxItem,
\o Adding Q_PROPERTYs appropriate for your item (see \l {properties}{Properties}),
\o Reimplementing the relevant paint functions,
\o Registering the type with the QML_DECLARE_TYPE and QML_DEFINE_TYPE macros (see \l {register}{Register}).
\endlist
\section2 Creating a subclass of QFxItem
To add a new type, you first must add a new C++ class derived from QFxItem.
You may of course extend existing QFxItem subclasses.
One existing subclass is QFxPainted, which provides
a simple cached-image painting model.
\section2 Reimplementing paint functions
Two alternative painters are available, offering
different levels of performance and functionality:
QPainter, GLPainter.
You can choose to subclass QFxPainted rather than QFxItem,
and then implement the virtual method:
\code
void paint(QPainter *painter);
\endcode
This paints into an offscreen pixmap which is then painted to the display (transformed,
etc. as needed). The cost of this offscreen pixmap should be carefully considered, as
should the specific performance of the painting done in the paint function.
If you require more control, subclass QFxItem instead.
QFxItem subclasses must implement both simple software canvas painting
and GL painting:
\list
\o \c QFxItem::paintContents(QPainter &) for the simple software canvas,
\o \c QFxItem::paintGLContents(GLPainter &) for OpenGL.
\endlist
See the documentation of those functions for detailed subclassing notes.
*/