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中是不能够访问的。

相关推荐
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉3 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer3 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
记录成长java5 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山5 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
青花瓷5 小时前
C++__XCode工程中Debug版本库向Release版本库的切换
c++·xcode
睡觉谁叫~~~5 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
音徽编程5 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust