Qml与C++交互
文档如是说,使用C ++代码中定义的功能可以轻松扩展QML。
由于QML引擎与Qt元对象系统的紧密集成,可以从QML代码访问由QObject派生的类适当公开的任何功能。
这使得C ++类的属性和方法可以直接从QML访问,通常很少或无需修改。
QML引擎能够通过元对象系统内省QObject实例。
这意味着,
- 任何QML代码都可以访问QObject派生类实例的以下成员:
- 属性(使用Q_PROPERTY注册的属性)
- 方法(需注册为public slots或是标记为Q_INVOKABLE)
- 信号
(此外,如果已使用Q_ENUMS声明枚举,则可以使用枚举。)
通常,无论是否已向QML类型系统注册了QObject派生类,都可以从QML访问它们。
但是,如果QML引擎要访问其他类型信息(例如,如果要将类本身用作方法参数或属性,或者要将其中一个枚举类型用于以这种方式使用),那么该类可能需要注册。
QML中调用C++类型
例子
颜色改变例子
新建一个ColorMaker类
colormaker.h文件如下:
#ifndef COLORMAKER_H
#define COLORMAKER_H
#include <QObject>
#include <QColor>
#include <QTimerEvent>
class ColorMaker : public QObject
{
Q_OBJECT
Q_ENUMS(GenerateAlgorithm)
Q_PROPERTY(QColor color READ getColor WRITE setColor NOTIFY colorChanged)
Q_PROPERTY(QColor timeColor READ timeColor)
public:
explicit ColorMaker(QObject *parent = 0);
enum GenerateAlgorithm
{
RandomRGB,
RandomRed,
RandomBlue,
RandomGreen,
LinearIncrease
};
QColor getColor() const;
void setColor(const QColor &color);
QColor timeColor() const;
Q_INVOKABLE GenerateAlgorithm algorithm() const;
Q_INVOKABLE void setAlgorithm(GenerateAlgorithm algorithm);
signals:
void colorChanged(const QColor &color);
void currentTime(const QString &timeStr);
public slots:
void start();
void stop();
protected:
void timerEvent(QTimerEvent *e);
private:
GenerateAlgorithm m_algorithm;
QColor m_currentColor;
int m_nColorTimer;
};
#endif // COLORMAKER_H
colormaker.cpp文件
#include "colormaker.h"
#include <QDateTime>
ColorMaker::ColorMaker(QObject *parent) : QObject(parent),
m_algorithm(RandomRGB),
m_currentColor(Qt::black),
m_nColorTimer(0)
{
qsrand(QDateTime::currentDateTime().toTime_t());
}
QColor ColorMaker::getColor() const
{
return m_currentColor;
}
void ColorMaker::setColor(const QColor &color)
{
m_currentColor = color;
}
QColor ColorMaker::timeColor() const
{
QTime time = QTime::currentTime();
int r = time.hour();
int g = time.minute();
int b = time.second();
return QColor::fromRgb(r, g, b);
}
ColorMaker::GenerateAlgorithm ColorMaker::algorithm() const
{
return m_algorithm;
}