当前位置: 首页 > article >正文

【Qt】Qt C++ Widget中嵌入qml

1. 效果

在这里插入图片描述

2. 方法

  • 使用QQuickWidget方式
	QQuickWidget *view = new QQuickWidget;
    view->setSource(QUrl::fromLocalFile("myqmlfile.qml"));
    view->show();
  • 除了QQuickWidget方式还可以使用QQuickView方式,请自行查阅资料

3. 代码

3.1 工程目录

在这里插入图片描述

3.2 pro文件

备注:需要添加 quickwidgets

QT       += core gui quickwidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    dialog.cpp

HEADERS += \
    dialog.h

FORMS += \
    dialog.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

DISTFILES +=

RESOURCES += \
    res.qrc

3.3 main.cpp

#include "dialog.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    return a.exec();
}

3.4 dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

signals:
    cppClick();

public slots:
    void onQmlClick();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Dialog *ui;
};
#endif // DIALOG_H

3.5 dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QtQuickWidgets>


Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);

    //c++向qml中传数据
    ui->quickWidget->rootContext()->setContextProperty("$color", "red");

    //qml导入
    QUrl source("qrc:/qmlFile.qml");
    ui->quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
    ui->quickWidget->setSource(source);
    ui->quickWidget->setClearColor(QColor(Qt::transparent));

    //qml与c++交互
    QQuickItem* qmlItem = ui->quickWidget->rootObject();
    connect(qmlItem, SIGNAL(qmlClick()), this, SLOT(onQmlClick()));
    connect(this, SIGNAL(cppClick()), qmlItem, SLOT(onCppClick()));
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::onQmlClick()
{
    qDebug() << "this is C++: qml's click";
}


void Dialog::on_pushButton_clicked()
{
    emit cppClick();
}


3.6 qmlFile.qml

import QtQuick 2.15
import QtQuick.Controls 2.15

Item {
    id: _mRoot

    signal qmlClick();

    function onCppClick()
    {
        console.log("this is qml: cpp's click")
    }

    Rectangle{
        width: 200
        height: 200
        color: $color
        border.color: "grey"
        border.width: 1

        Button{
            width: 100
            height: 50
            text: "qml button"
            anchors.centerIn: parent

            onClicked: {
                qmlClick();
            }
        }
    }
}

3.7 dialog.ui

在这里插入图片描述

4. 参考

  • Qt 之 QWidget嵌入Qml文件以及如何交互
  • 通俗易懂玩QT:QQuickWidget学习

http://www.kler.cn/a/307724.html

相关文章:

  • How to install rust in Ubuntu 24.04
  • leetcode hot100【LeetCode 236.二叉树的最近公共祖先】java实现
  • 入侵排查之Linux
  • C++常用的新特性-->day06
  • Python学习26天
  • Android 13 实现屏幕熄屏一段时候后关闭 Wi-Fi 和清空多任务列表
  • Python酷库之旅-第三方库Pandas(120)
  • type和interface区别
  • redis 十大应用场景
  • 《Effective Debugging:软件和系统调试的66个有效方法》读书笔记-Part2
  • 828华为云征文|华为Flexus云服务器搭建Cloudreve私人网盘
  • 优化Web性能:Varnish中精准识别并缓存移动与桌面请求
  • html+css网页设计 旅游网站首页1个页面
  • WPF入门教学一 WPF简介
  • 【C++前后缀分解 动态规划】2100. 适合野炊的日子|1702
  • ROS笔记3.路径规划1
  • 卸载Linux 内核 以及NVIDIA驱动
  • 【学习归纳自我总结版】尚硅谷学习第一天
  • 1、vectorCast单元测试常用操作
  • 无人机培训机构技术股份合作探讨
  • 数据结构修炼——顺序表和链表的区别与联系?
  • 【C++】STL数据结构最全函数详解2-向量vector
  • EndnoteX9安装及使用教程
  • 腾讯云Ubuntu系统安装宝塔,配置Java环境,运行spring boot项目
  • 系统架构设计师教程 第7章 7.1 软件架构概念 笔记
  • 每日奇难怪题(持续更新)