首页 > 编程语言 > 详细

QT QUICK和C++结合编程

时间:2021-02-03 12:11:25      阅读:21      评论:0      收藏:0      [点我收藏+]

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的枚举类型在直接注册时会编译失败,

QT QUICK和C++结合编程

原文:https://www.cnblogs.com/wuya178/p/14365491.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!