QtWidgets和QtQuick融合(QML与C++融合)

先放一个界面效果吧!

说明:该演示程序为一个App管理程序,可以将多个App进行吸入管理。

(动画中的RedRect为一个带有QSplashScreen的独立应用程序)

  • 左侧边栏用的是QQuickView进行.qml文件的加载(即QtQuick环境)
  • 右侧是用layout进行QWidget的融入(QtWidgets环境)
  • 期间会有多次qml & c++的交互

一、qml中访问c++中的内容

关键点:.h中继承QObject、Q_DECLARE_METATYPE;.cpp中qmlRegisterType

cpp 复制代码
class AppInfo : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString showName READ showName WRITE setShowName NOTIFY showNameChanged)
    Q_PROPERTY(QString realName READ realName WRITE setRealName NOTIFY realNameChanged)
    Q_PROPERTY(QString coreName READ coreName WRITE setCoreName NOTIFY coreNameChanged)
    Q_PROPERTY(QString iconPath READ iconPath WRITE setIconPath NOTIFY iconPathChanged)
public:
    AppInfo(QObject* parent = nullptr);
    AppInfo(const QString& showName, const QString& realName, const QString& coreName, const QString& iconPath, QObject* parent = nullptr);
    AppInfo(const AppInfo& other);
    AppInfo& operator=(const AppInfo& other);
    bool operator==(const AppInfo& other);


    QString showName() const;
    QString realName() const;
    QString coreName() const;
    QString iconPath() const;
    void setShowName(const QString& showName);
    void setRealName(const QString& realName);
    void setCoreName(const QString& coreName);
    void setIconPath(const QString& iconPath);

signals:
    void showNameChanged();
    void realNameChanged();
    void coreNameChanged();
    void iconPathChanged();

private:
    QString showName_;
    QString realName_;
    QString coreName_;
    QString iconPath_;
};

Q_DECLARE_METATYPE(AppInfo)
cpp 复制代码
qmlRegisterType<AppInfo>();

这样以后,

1.1.可以直接在qml中进行该类的实例化,进而进行访问(qmlRegisterType时需要添加参数);

1.2.也可以直接在其他类中直接返回该类指针,直接给qml进行使用(当然前提也是其他类也进行了注册,已经在qml里实例化了)。

1.3.还可以再c++处实例化,然后设置到qml上下文中

2.1.也可以直接继承QAbstractListModel等类,进行实例化,qml中可以直接访问相关属性

主要在于红框中的方法的重写。


二、c++中访问qml中的内容

主要在于从qml上下文中获取根QObject*,进而通过findChild进行相关元素的获取。进而通过QMetaObject::invokeMethod进行相关qml中function的调用:


相关注意点:

qml中访问只能访问类的指针,不能访问类对象;

qmlRegisterType注册类时,带了namespace的类,类指针在qml中是不能够访问的。

相关推荐
小王不爱笑1326 小时前
IO 模型
开发语言·python
知我Deja_Vu7 小时前
【避坑指南】ConcurrentHashMap 并发计数优化实战
java·开发语言·python
AI+程序员在路上7 小时前
CANopen 协议:介绍、调试命令与应用
linux·c语言·开发语言·网络
2401_831824967 小时前
基于C++的区块链实现
开发语言·c++·算法
汉克老师8 小时前
GESP5级C++考试语法知识(六、链表(一)单链表)
c++·链表·单链表·快慢指针·进阶·gesp5级·gesp五级
m0_518019488 小时前
C++与机器学习框架
开发语言·c++·算法
ZTLJQ8 小时前
深入理解逻辑回归:从数学原理到实战应用
开发语言·python·机器学习
qq_417695058 小时前
C++中的代理模式高级应用
开发语言·c++·算法
学嵌入式的小杨同学8 小时前
STM32 进阶封神之路(十九):ADC 深度解析 —— 从模拟信号到数字转换(底层原理 + 寄存器配置)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
xiaoye-duck8 小时前
《算法题讲解指南:动态规划算法--路径问题》--5.不同路径,6.不同路径II
c++·算法·动态规划