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

相关推荐
省四收割者7 分钟前
Go语言入门(20)-nil
开发语言·vscode·golang
19岁开始学习7 分钟前
Go语言中的Zap日志库
开发语言·golang·xcode
数据知道7 分钟前
Go基础:用Go语言操作MongoDB详解
服务器·开发语言·数据库·后端·mongodb·golang·go语言
爱喝白开水a14 分钟前
2025时序数据库选型,从架构基因到AI赋能来解析
开发语言·数据库·人工智能·架构·langchain·transformer·时序数据库
朝新_16 分钟前
【EE初阶 - 网络原理】网络通信
java·开发语言·网络·php·javaee
TeleostNaCl21 分钟前
使用 jintellitype 库在 Java 程序中实现监听 Windows 全局快捷键(热键)
java·开发语言·windows·经验分享·kotlin·电脑
盛世隐者1 小时前
python包管理器——uv
开发语言·python·uv
细节控菜鸡1 小时前
【2025最新】ArcGIS for JS 实现地图卷帘效果
开发语言·javascript·arcgis
无敌最俊朗@2 小时前
如何把qt + opencv的库按需要拷贝到开发板
linux·qt
liulilittle2 小时前
网络编程基础算法剖析:从字节序转换到CIDR掩码计算
开发语言·网络·c++·算法·通信