Qt C++属性类型提供给 QML调用(四)

56 篇文章 46 订阅

前言

前面已经介绍了三种关于 QML 调用 C++的属性方法,那么,今天继续介绍一种新的属性调用:分组属性。

分组属性

QML 调用 C++的分组属性,所谓的分组属性, 其实和第二篇文章介绍的调用类属性有些类似,写法有点类似下面这种形式:

Rectangle{
    anchors.left: ...
    anchors.leftMargin:...
}

这其实就是一个分组属性,这两个属性都是属于anchors组的。
但是这里需要注意的是,分组属性仅仅和对象属性的写法相同,但是其实际上有比较大的区别,因为分组属性是只读的,并且在构造时由父对象初始化为有效值。分组属性的子属性可以从QML修改,但分组属性对象本身永远不会改变,而对象类型属性可以随时从QML分配一个新的对象值。因此,分组属性对象的生命周期严格受C ++父实现控制,而对象类型属性可以通过QML代码自由创建和销毁。

那么如何去调用 C++的分组属性呢,来看看以下示例:

class StudentInfo : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString className READ getClass WRITE setClass)
    Q_PROPERTY(QString address READ getAddress WRITE setAddress)
public:
    explicit StudentInfo(QObject * parent = 0):QObject(parent) {}

    void setClass(const QString & c){
        if(c != m_class){
            m_class = c;
        }
    }
    QString getClass()const{return m_class;}

    void setAddress(const QString & a){
        if(a != m_address){
            m_address = a;
        }
    }
    QString getAddress()const{return m_address;}

private:
    QString m_class;
    QString m_address;
};


class Student : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name READ getName WRITE setName NOTIFY sigNameChanged)
    Q_PROPERTY(StudentInfo* info READ getInfo)

public:
    explicit Student(QObject *parent = nullptr):
        QObject(parent)
    {
        m_info = new StudentInfo(this);
    }
    ~Student(){}


    void setName(const QString & name){
        if(name != m_name){
            m_name = name;
            emit sigNameChanged(m_name);
        }
    }
    QString getName() const {return m_name;}

    StudentInfo * getInfo(){return m_info;}

signals:
    void sigNameChanged(QString name);


private:
    QString m_name;
    StudentInfo * m_info = NULL;

};

然后在 Main 函数中注册:

qmlRegisterType<Student>("Student", 1, 0, "Student");
qmlRegisterType<StudentInfo>("StudentInfo", 1, 0, "StudentInfo");

在 QML 中进行调用:

Student{
    info.className:"aaa"
    info.address:"bbb"
}

然后我们会到 main函数中将信息输出:

QQmlEngine engine;
QQmlComponent component(&engine, QUrl("qrc:main.qml"));
Student *student = qobject_cast<Student *>(component.create());

if(student){
    qWarning() << "   " << student->getInfo()->getAddress() << student->getInfo()->getClass() ;
}

编译运行,输出如下:

"bbb" "aaa"

其实用法很简单,就不再多说啦。
代码在这里

Qt中,使用QMLQt Markup Language)调用摄像头通常涉及以下几个步骤: 1. **添加必要的库**: 首先,在构建环境中需要包含Qt Quick Controls 2模块,它包含了处理多媒体功能所需的部分。 ```xml import QtQuick 2.0 import QtQuick.Controls 2.0 ``` 2. **设置权限**: 要访问用户的摄像头,需要在运行时请求权限。这通常通过`QtCameraViewfinder`组件来完成,它允许用户选择设备。 ```qml QtCameraViewfinder { id: cameraViewfinder anchors.fill: parent active: true } ``` 3. **设置相机源**: 使用`QtCamera`组件,它可以连接到摄像头设备并提供视频流。在C++部分,你需要实例化一个相机,并将其绑定到`QtCameraViewfinder`。 ```cpp #include <QtMultimedia/QCamera> // ... QObject::connect(cameraViewfinder->camera, &QtCamera::stateChanged, this, [this](QtCamera::State state) { if (state == QtCamera::ReadyState) { // Camera is now ready to capture frames } }); ``` 4. **处理视频流**: 当状态变为`ReadyState`时,你可以开始从`QtCamera`读取帧数据,并在QML中处理它们,例如显示在`Image`组件上。 ```cpp QImage image = cameraViewfinder->previewFrame(); imageSource.source = image; ``` 5. **事件处理**: 为了实时更新预览,你可以监听`previewFrameRequested`信号并在C++提供新帧。 ```cpp connect(cameraViewfinder, &QtCameraViewfinder::previewFrameRequested, [=] { QImage frame = cameraViewfinder->previewFrame(); emit previewFrame(frame); }); ``` 6. **在QML中接收图像**: 在QML中,可以创建一个信号槽来接收到图像并显示在`Image`组件或其他UI元素上。 ```qml onPreviewFrame: imageSource.source = source Image { id: displayImage source: previewFrame } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luoyayun361

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

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

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

打赏作者

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

抵扣说明:

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

余额充值