QR扫码综合示例教程(十七)Qt5.15.2(qml)拍照捕获视频帧

前言:

 本示例在 Qt5.15.2(qml)取出视频帧 原始帧,示例的基础上修改

一、添加工具类

添加一个工具类Tool,用于从文件加载图像文件,头文件如下

#include <QObject>

class Tool : public QObject
{
    Q_OBJECT
public:
    explicit Tool(QObject *parent = nullptr);

    //从文件加载图像文件
    Q_INVOKABLE void setCapturedImage(const QString &imageFileName);
signals:

};

源文件关键代码如下

/*!
 * \brief Tool::setCapturedImage 从文件加载图像文件
 * \param imageFileName 文件全名
 */
void Tool::setCapturedImage(const QString &imageFileName)
{
    QImage image;
    image.load(imageFileName);
    //将视频帧放入图像提供者
    ImageProvider::setImage(image);
}

在main()函数中,将Tool注册到qml中

qmlRegisterType<Tool>("com.xdqd.classes", 1, 0, "Tool");

二、修改UI显示

如下所示,是笔者修改的UI

增加一个Label,用于显示已从C++加载的图像;再增加一个拍照的按钮

修改qml文件,关键代码如下

    Tool {
        id: tool
    }

    Connections {
        target: button_capture
        function onClicked() {
            console.debug("button_capture onClicked")
            camera.imageCapture.capture();//文件保存到默认目录
            //camera.imageCapture.captureToLocation();//文件保存到指定目录
        }
    }

    Connections {
        target: camera.imageCapture
        function onCaptureFailed(requestId, message) {//捕获图像出错
            console.debug("onImageCaptured",requestId,message)
        }

        function onImageCaptured(requestId, preview) {//已捕获图像的url
            // Show the preview in an Image
            console.debug("onImageCaptured",requestId,preview)
            image.source = preview
        }
        function onImageSaved(requestId, path) {//已捕获图像的文件名
            console.debug("onImageSaved",requestId,path)
            tool.setCapturedImage(path)
            //必须要更换下,否则图像不会发生变化
            image2.source = "image://imageProvider/0"
            image2.source = "image://imageProvider/1"
        }
    }

注意:

(1)camera.imageCapture.capture()

截取的图像就放在系统默认的图像文件目录中,win10下是图片目录

camera.imageCapture.captureToLocation();

截取的图像就放在指定目录

(3)用完截图后,一定要记得删除,否则会越来越多

添加完成后,就可以运行程序了,以下是笔者的运行结果 

本次教程的示例源码

后记:

Qt5的每一次拍照,都会生成一个图片文件,需要小伙伴自己删除,Android上也不例外。

时间所限,笔者只在win10、Android上测试了下,其他操作系统没测试,请小伙伴自己测试

Android上的默认目录无法直接从文件管理中访问,建议直接指定SD的目录

Qt6的示例也写完了,今天有点困了,明天再上传好了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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.2的QML可以支持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.2的QML中使用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
发出的红包

打赏作者

꧁白杨树下꧂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值