QT QUICK和C++结合编程

QT QUICK和C++结合编程

一、注册C++类为qml可以使用的类型

qt quick优先使用这种方式编程。做qt quick,使用.qml文件编译生成的应用程序。
在qt quick中没有现成可用的qml类型的情况下,需要使用C++自己编写相关的类注册为qml可使用的类型。
注册完成后和qt quick自带的类型没有任何区别,也是qml可扩展性的体现。qt quick官方的类型也都是用C++编写注册的。
QT QUICK的应用程序优先采用这种方式,在设计模式中符合工厂模式和功能单一模式。注册的类型也可以注册为单例类 。主体代码界面逻辑都用qml写,没有支持的类型再用C++写,这样类型可扩展,也符合设计模式中的开闭原则。耦合度低便于软件分工


主要流程参考《Qt Quick核心编程》一书,本文基本和书里示例一致。
1、定义可以导出的C++类
前提:必须是Q_Object类的派生类,才可以注册到QT的元对象系统。
使用Q_OBJECT宏

class screenRecorder : public QObject
{
    Q_OBJECT
}

2、一个类的成员函数用Q_INVOKABLE修饰就可以在qml中使用了

Q_INVOKABLE QString path() { return m_path;}
Q_INVOKABLE void screenGrab(QQuickWindow *rootWindow);
Q_INVOKABLE void screenShot(QQuickWindow *rootWindow);
Q_INVOKABLE void itemGrab(QQuickItem *item);

3、用Q_PROPERTY宏修改类的属性变量,qml中直接使用属性

Q_PROPERTY (bool recording READ recording NOTIFY recordingChanged )
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
Q_PROPERTY(QString format READ format WRITE setFormat NOTIFY formatChanged)
Q_PROPERTY(int framerate READ framerate WRITE setFramerate NOTIFY framerateChanged)

Q_PROPERTY宏支持10个变长的参数,大部分情况下只使用以上三个变量:READ/WRITE/NOTIFY.注册为属性后变量在qml中使用和默认的类型一样了:

ScreenRecorder{
    id:screenrecorder
    format: $hub.formatRec
    framerate: $hub.framerateRec
    onRecordingChanged: {
    	console.log("recording: " + recording);
    }
    onNameChanged: {
    	console.log("start recording: " + name);
    }
}

注册了变量的NOTIFY属性要注意,已经完成了信号的绑定。当属性值赋值变化时会自动发送NOTIFY定义的信号,不用手动绑定。
例如:
.cpp中

Q_PROPERTY(QString format READ format WRITE setFormat NOTIFY formatChanged)\\注册的属性
...
signals:
    void formatChanged(QString);//定义的同名信号

.qml中

//属性赋值,自动触发绑定的NOTIY信号函数不用emit。信号函数在C++文件中定义。
screenrecorder.name = Qt.formatDateTime(new Date(),"yyyy-MM-dd-hh:mm:ss.")+$hub.formatRec;
//用C++注册的函数设置变量,在C++函数中用emit方法手动触发改变信号。本项目中用这种方式,这样C++和qml中都可以改变成员变量和触发信号消息。
screenrecorder.setName(Qt.formatDateTime(new Date(),"yyyy-MM-dd-hh:mm:ss.")+$hub.formatRec);

4、注册枚举类型为qml可以使用的类型

class audioRecorder : public QObject
{
    Q_OBJECT
    Q_ENUMS(EncodingQuality)
    Q_ENUMS(ContainerName)
    Q_PROPERTY ( bool recording READ recording NOTIFY recordingChanged )
    public:
        enum ContainerName
        {
            WAV,
            MP3
        };
        enum EncodingQuality
        {
            VeryLowQuality,
            LowQuality,
            NormalQuality,
            HighQuality,
            VeryHighQuality
        };
        ...
}

注意:其中EncodingQuality枚举类型其实是QMultimedia::EncodingQuality的枚举类型在直接注册时会编译失败,

posted @   wuya178  阅读(516)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示