qwidget嵌入qml界面

4 篇文章 0 订阅

说明

在我们日常使用qt/C++的界面开发过程中,通常想要自定义、实现某些特定的非常美观、炫酷界面,使用qwidget的方式是比较麻烦且复杂的,如果滑动、动画等操作,qwidget需要重写事件,且还需要定义滑动的逻辑。
但是,Qt Quick 使用 QML 构建的一套类库几乎完美补足了此问题,如果只是做界面,使用qml还是非常完美的。QML 是一种基于 JavaScript 的声明式脚本语言,其性能相对C++来说性能还是稍微低了点,不过qt5.2之后版本对qml引擎进行了优化,性能还是提升了很多。

在Qt5中推出了一个新的渲染底层 Scene Graph,来替代Qt4时期的 Graphics View。如果大家使用过Qt5的 Qt Quick 模块,你会感觉 Qt Quick 的画面渲染速度和效率比Qt4的 GraphicsView 来说好了很多。主要原因是在渲染部分精简了渲染堆栈,并且充分利用显卡加速,将渲染负担转移到GPU来进行,实现了负载均衡。
原文链接:https://blog.csdn.net/qq_34139994/article/details/105369719

本文就是写明如何在基于qwidget开发的程序中嵌入优美的qml界面,毕竟在嵌入式开发中,还是不能抛弃C++的,当然项目也完全可以实现业务(C++)与界面(qml)进行分离操作,但是我们有时候在qwidget开发的基础上,需要使用某个C++比较难实现,而qml比较容易实现的控件呢?比如键盘或者一些滑动、动画的控件?这样就需要查看本文了。

其实qwidget与qml都是窗口渲染方式不同,导致无法直接相互嵌入。

原理

1、使用QQuickView 类提供一个用于显示 Qt Quick 用户界面的窗口。
2、使用QQmlContext 类定义 QML 引擎中的上下文。通过该类可实现C++和qml属性数据的交互,比如读取qml控件中的公开属性(成员变量)。
3、使用QWidget::createWindowContainer()函数,将QtQuick组件嵌入到QWidget中,该函数直接返回qwidget指针。

实现

1、通过QQuickView 类添加qml控件代码文件:

    QQuickView *mQuickView = new QQuickView();
    mQuickView->setSource(QUrl("qrc:/testQml.qml"));

2、将qml控件导入QWidget中:

QWidget *mQuickWidget = QWidget::createWindowContainer(mQuickView, this);
//设置被嵌入的窗口大小和位置
 mQuickWidget->setMinimumSize(80,30);
 mQuickWidget->move(0,0);
 mQuickWidget->show(); // 显示qml

3、设置qml控件成员及读取其值

	QQmlContext *mQuickContext = mQuickView->rootContext();// 用于与qml交互
	
	//首先进行读取,属性名:quickWidgetWidth、quickWidgetHeigh
    int width = mQuickContext->contextProperty("quickWidgetWidth").toInt();
    int hight = mQuickContext->contextProperty("quickWidgetHeigh").toInt();
    qDebug()<<"width:"<<width;
    qDebug()<<"hight:"<<hight;
    
	//设置qml控件quickWidgetWidth、quickWidgetHeigh属性
    mQuickContext->setContextProperty("quickWidgetWidth", 30);
    mQuickContext->setContextProperty("quickWidgetHeight", 30);
   	
   	//读取显示,测试是否写入成功
    width = mQuickContext->contextProperty("quickWidgetWidth").toInt();
    hight = mQuickContext->contextProperty("quickWidgetHeigh").toInt();
    qDebug()<<"width:"<<width;
    qDebug()<<"hight:"<<hight;

4、测试用的testQml.qml文件:

import QtQuick 2.0
 
Rectangle {
    x: 0; // 缺省为0
    y: 0; // 缺省为0
    width: quickWidgetWidth;   // width是宽度
    height: quickWidgetHeight; // height是高度
    color: "red";
}
  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值