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中访问