1 setContextProperty 注入实例
void QQmlContext::setContextProperty(const QString &name, QObject *value)
Set the value of the name property on this context.
QQmlContext does not take ownership of value.
See also contextProperty().
cpp的类 persion.h 和persion,cpp
#ifndef PERSON_H
#define PERSON_H
#include <QObject>
#include <QString>
class Person : public QObject
{
Q_OBJECT
public:
explicit Person(QString name,int age);
//Q_INVOKABLE 函数可以被qml调用
Q_INVOKABLE void printInfo() const noexcept;
signals:
private:
QString _name;
int _age;
};
#endif // PERSON_H
#include "person.h"
#include <QDebug>
Person::Person(QString name,int age)
:_name(qMove(name))
,_age(qMove(age))
{
}
void Person::printInfo() const noexcept{
qDebug() << "name" << _name << ";age" << _age;
}
main函数的调用
qml文件中调用cpp的printinfo方法:
连接qml的信号和cpp的槽
连接qml中Button的clicked
qml自定义信号
Button{
objectName:"testButton"
text: "button"
property int clickCnt: 0
signal clickCount(int cnt)
onClicked: {
TestModule.printInfo();
clickCount(++clickCnt)
}
}
连接:
qml中处理c++信号
2 qmlRegisterType 注入类型
int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
该模板函数在 QML 系统中注册名为 qmlName 的 C++ 类型,在从 url导入的库中,该库具有由 versionMajor 和 versionMinor 组成的版本号。
返回 QML 类型 ID。
这个模板函数有两种形式:
前者是将类型 T 注册为新类型的标准形式。后者允许在指定版本中注册类的特定修订(请参阅类型修订和版本)。
class Bar : public QObject
{
Q_OBJECT
Q_PROPERTY(QString baz READ baz WRITE setBaz NOTIFY bazChanged)
public:
Bar() {}
QString baz() const { return mBaz; }
void setBaz(const QString &baz)
{
if (baz == mBaz)
return;
mBaz = baz;
emit bazChanged();
}
signals:
void bazChanged();
private:
QString mBaz;
};
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
import Bar 1.0
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Button{
objectName:"testButton"
text: "button"
property int clickCnt: 0
signal clickCount(int cnt)
onClicked: {
bar.baz = "cnt" + clickCnt
clickCount(++clickCnt)
}
}
Bar {
id:bar
baz: "abc"
onBazChanged:{
console.log("bar",baz)
}
}
}
附加属性qmlAttachedPropertiesObject
demo:声明Bar 是Foo的附加属性
#ifndef BAR_H
#define BAR_H
#include <QObject>
#include <qqml.h>
class Bar : public QObject
{
Q_OBJECT
Q_PROPERTY(QString baz READ baz WRITE setBaz NOTIFY bazChanged)
public:
Bar(QObject *object):QObject(object) {}
QString baz() const { return mBaz; }
void setBaz(const QString &baz)
{
if (baz == mBaz)
return;
mBaz = baz;
emit bazChanged();
}
signals:
void bazChanged();
private:
QString mBaz;
};
class Foo : public QObject
{
Q_OBJECT
public:
Foo() {}
static Bar *qmlAttachedProperties(QObject *object) // 需要定义一个静态函数来返回这个静态属性的对象
{
//当QML声明该附加属性时调用这个函数,返回一个该附加属性类的对象
return new Bar(object);
}
private:
};
QML_DECLARE_TYPEINFO(Foo, QML_HAS_ATTACHED_PROPERTIES) // 利用QML_DECLARE_TYPEINFO声明使Foo类得以支持附加属性
#endif // BAR_H
若是使用C++来扩展QML,要想实现一个附加属性的功能,需要两个步骤:
提供一个静态函数:static [类型] * qmlAttachedProperties(QObject *); 注意,这个返回类型可以是自身,也可以是关联的类型
使用宏声明该类型支持附加属性:QML_DECLARE_TYPEINFO([类型], QML_HAS_ATTACHED_PROPERTIES)
注册:
使用附加属性:
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
import Foo 1.0
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Button{
objectName:"testButton"
text: "button"
property int clickCnt: 0
signal clickCount(int cnt)
onClicked: {
Foo.baz = "cnt" + clickCnt++
console.log("bar",Foo.baz)
}
Foo.onBazChanged:{
console.log("onBazChanged",Foo.baz)
}
}
}