QT5.15.2 QML import 多层相对路径设置

QT5.15.2  QML import 多层相对路径设置

使用多层相对路径,如 import "../../shared" as Examples 在编译时没有问题,但应用程序在手机上执行时,会出现"../../shared" No such directory问题,应用闪退。

使用单层相对路径,如 import "../shared" as Examples 在编译和应用中,都不会有问题

使用qrc方式,如 import "qrc:/shared" as Examples, 无论相对路径如何,在编译和应用中,都不会有问题。但要先把多层相对路径的qrc文件添加到工程的资源中。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是的,Qt5.15.2 QML 可以支持 QSharedPointer 类型的智能指针注册,并在 QML 中使用。 首先,你需要使用 `qmlRegisterUncreatableType()` 函数将 QSharedPointer 注册为不可创建的类型。在注册时,你需要提供一个类型名和所有者类型。所有者类型是智能指针所拥有的类型,可以是任何 QObject 派生类型。以下是注册 QSharedPointer 的示例代码: ```cpp qmlRegisterUncreatableType<QSharedPointer<MyObject>>("MyApp", 1, 0, "SharedPtr", "QSharedPointer cannot be created in QML"); ``` 在 QML 中,你可以使用 `SharedPtr` 类型来声明一个 QSharedPointer 实例。例如: ```qml import MyApp 1.0 Item { property SharedPtr obj: SharedPtr.createObject() Component.onCompleted: { obj.data.name = "Hello World" } } ``` 在上面的例子中,我们声明了一个名为 `obj` 的 `SharedPtr` 属性,并在 `Component.onCompleted` 信号中给 `obj` 所指向的对象赋值。请注意,我们使用 `data` 成员来访问 QSharedPointer 中的对象。 需要注意的是,当在 QML 中使用 QSharedPointer 时,你需要小心管理所有权。通常情况下,你应该避免将 QSharedPointer 实例传递给 QML,因为 QML 中的对象生命周期管理可能会与 C++ 中不同。相反,你可以将 QSharedPointer 实例封装在一个 QObject 派生类型中,并将该类型注册为可创建类型,然后在 QML 中创建该类型的实例。例如: ```cpp class MyObjectWrapper : public QObject { Q_OBJECT Q_PROPERTY(QSharedPointer<MyObject> obj READ obj WRITE setObj NOTIFY objChanged) public: QSharedPointer<MyObject> obj() const { return m_obj; } void setObj(QSharedPointer<MyObject> obj) { if (m_obj != obj) { m_obj = obj; emit objChanged(); } } signals: void objChanged(); private: QSharedPointer<MyObject> m_obj; }; qmlRegisterType<MyObjectWrapper>("MyApp", 1, 0, "MyObjectWrapper"); ``` 现在,在 QML 中,你可以使用 `MyObjectWrapper` 类型来声明一个包含 QSharedPointer 实例的对象。例如: ```qml import MyApp 1.0 MyObjectWrapper { obj: SharedPtr.createObject() } ``` 在这种情况下,你可以安全地将 `MyObjectWrapper` 实例传递给 QML,并在 QML 中使用 QSharedPointer 实例。 ### 回答2: 是的,Qt5.15.2QML可以支持QSharedPointer类型的智能指针注册和在QML中使用。在注册类型时,您可以使用qmlRegisterUncreatableType()函数将QSharedPointer类型注册为不可创建的类型,以防止在QML中直接创建该类型的对象。例如,您可以这样注册QSharedPointer<MyObject>类型: ```cpp qmlRegisterUncreatableType<QSharedPointer<MyObject>>("CustomTypes", 1, 0, "SharedPointer", "Cannot create objects of type SharedPointer in QML"); ``` 在上述代码中,我们将QSharedPointer<MyObject>注册为名为SharedPointer的不可创建类型,并将其命名空间定义为"CustomTypes",版本为1.0。 然后,在QML文件中,您可以使用该类型,例如: ```qml import CustomTypes 1.0 Item { id: root property SharedPointer myObject: SharedPointer.createObject() Component.onCompleted: { myObject.data.someProperty = "Hello" console.log(myObject.data.someProperty) // 输出 "Hello" } } ``` 上面的例子中,我们创建了一个名为myObject的SharedPointer实例,并将其属性设置为一个新的MyObject实例。然后,在Completed信号中,我们可以访问和修改myObject中MyObject实例的属性。 因此,通过使用qmlRegisterUncreatableType()将QSharedPointer类型注册为不可创建的类型,并在QML中使用SharedPointer属性,您可以在Qt5.15.2QML中使用QSharedPointer类型的智能指针。 ### 回答3: Qt 5.15.2 QML可以支持QSharedPointer类型的智能指针注册,并可以在QML中使用。 QSharedPointer是Qt提供的一种智能指针类型,用于管理动态内存分配。它可以在堆上创建对象,并在不再需要时自动释放内存,从而避免了内存泄漏和野指针等问题。 为了在QML中使用QSharedPointer类型的智能指针,我们需要进行一些注册和转换操作。首先,我们需要在C++代码中将QSharedPointer注册为一个可以在QML中访问的类型。可以使用qmlRegisterType函数将QSharedPointer注册为QML类型,使其在QML中可以实例化和调用其方法。 在C++代码中,我们可以这样注册QSharedPointer: ```cpp qmlRegisterType<QSharedPointer<MyObject>>("MyModule", 1, 0, "MyObject"); ``` 这样就将QSharedPointer<MyObject>类型注册为MyModule.MyObject类型,可以在QML中使用。 在QML中,我们需要使用QtObject作为QSharedPointer对象的包装器。可以通过编写一个C++插件来实现。 ```cpp // MyObjectWrapper.h #ifndef MYOBJECTWRAPPER_H #define MYOBJECTWRAPPER_H #include <QObject> #include <QSharedPointer> class MyObject; class MyObjectWrapper: public QObject { Q_OBJECT public: explicit MyObjectWrapper(QObject *parent = nullptr); ~MyObjectWrapper(); QSharedPointer<MyObject> getObject() const; void setObject(QSharedPointer<MyObject> object); private: QSharedPointer<MyObject> m_object; }; #endif // MYOBJECTWRAPPER_H ``` ```cpp // MyObjectWrapper.cpp #include "MyObjectWrapper.h" #include "MyObject.h" MyObjectWrapper::MyObjectWrapper(QObject *parent) : QObject(parent) { } MyObjectWrapper::~MyObjectWrapper() { } QSharedPointer<MyObject> MyObjectWrapper::getObject() const { return m_object; } void MyObjectWrapper::setObject(QSharedPointer<MyObject> object) { m_object = object; } ``` 然后在QML中使用这个包装器: ```qml import MyModule 1.0 QtObject { property MyModule.MyObject myObject: MyModule.MyObjectWrapper { object: createMyObject() // 通过工厂函数创建MyObject对象 }.object } ``` 以上代码在QML中创建了一个QtObject对象,其属性myObject是一个MyObject对象的QSharedPointer。createMyObject()可以是一个工厂函数,用于创建MyObject对象。 以上就是Qt 5.15.2 QML如何支持QSharedPointer类型的智能指针注册,并在QML中使用的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值