cpp中自定义qml类型,并在qml中访问

1.与C++的交互

首先了解三个Register函数

1.1 qmlRegisterType:将自定义的cpp注册为qml支持类型,注册后可向官方内置类型一样正常使用

class UserModel: public QObject
{
    Q_OBJECT
    Q_PROPERTY(int userId READ getId WRITE setId NOTIFY idChanged FINAL)
	public:
		UserModel(QObject* parent = nullptr);
}

//使用前在函数中调用
qmlRegisterType<UserModel>("UserControl", 1, 0, "UserModel");

//在qml中使用
import UserControl 1.0

UserModel {
    id: userModel
    userId: 123
}

1.2 qmlRegisterSingletonType: 注册单列类,注册后在qml中直接用类名访问其属性、信号和槽函数

/*!
 * \brief 单例模式,通过该对象来操作UI元素,或者响应ui发出的信号
 */
 //.h
class GlobalUISignal : public QObject
{
    Q_OBJECT
public:
    explicit GlobalUISignal(QObject *parent = nullptr);    
    static GlobalUISignal* Instance() noexcept;    
    static QObject* qobject_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine) noexcept;
	
signals:
    void testSignalOne(/*信号参数,自定义类记得Q_DECLARE_METATYPE或qmlRegisterType*/);    
}

//.cpp

GlobalUISignal::GlobalUISignal(QObject *parent) { }

Q_GLOBAL_STATIC(GlobalUISignal, _signal_instance) // or static GlobalUISignal* _signal_instance{nullptr};
GlobalUISignal *Aimo::GlobalUISignal::Instance() noexcept { return _signal_instance; }

QObject *GlobalUISignal::qobject_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine) noexcept
{
    Q_UNUSED(engine)
    Q_UNUSED(scriptEngine)
    
    QQmlEngine::setObjectOwnership(_signal_instance,QQmlEngine::CppOwnership);
    return _signal_instance;
}

使用前注册

qmlRegisterSingletonType<GlobalUISignal>("UserControl",1,0,"GlobalUISignal",GlobalUISignal::qobject_singletontype_provider);

在qml和cpp中使用

Button {
	text: "test signal one"
	onClicked: {
		GlobalUISignal.testSignalOne(); //C++ 中也是这样调用		
	}
}

1.3 qmlRegisterUncreatableType: 注册为不可创建类,用此方法注册的类无法在qml中作为类型去定义任何对象,但可以作为qmlRegisterType和qmlRegisterSingletonType注册后的对象的属性在qml中访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值