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的枚举类型在直接注册时会编译失败,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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代理 了,记录一下