1、效果

2、QML

在资源里新建Mybattery.qml:

  1. import QtQuick 2.0
  2. import QtQuick 2.12
  3. Item {
  4. id: root
  5. property color color1: "#18FD18"//绿色,健康
  6. property color color2: "#FFFF1A"//黄色,注意
  7. property color color3: "#7F45AA"//紫色,恶化
  8. property color color4: "#FF1A1A"//红色,故障
  9. property color colorBase: color1
  10. property bool colorChangeFlag: true
  11. property int bat_value: 80
  12. signal setBat(double batValue)//对外接口,batValue是已经使用了多少电量,比如已经使用了80%则=80
  13. onSetBat: {
  14. console.log("in bat")
  15. if(batValue<0)//不能小于0
  16. {
  17. text_bat_text.text="err param";
  18. return;
  19. }
  20. else if(batValue>100)
  21. {
  22. bat_value=0;
  23. rect_bat_body.border.color=color4;
  24. }
  25. else
  26. {
  27. bat_value=100-batValue;
  28. rect_bat_body.border.color="gray"
  29. }
  30. if(batValue<=80)
  31. {
  32. text_bat_text.text="已使用"+batValue+"%"
  33. colorBase = color1;
  34. }
  35. else if((batValue>80)&&(batValue<=90))
  36. {
  37. text_bat_text.text="已使用"+batValue+"%"
  38. colorBase = color2;
  39. }
  40. else if((batValue>90)&&(batValue<=100))
  41. {
  42. text_bat_text.text="已使用"+batValue+"%"
  43. colorBase = color3;
  44. }
  45. else
  46. {
  47. text_bat_text.text="已使用"+batValue+"%"
  48. colorBase = color4;
  49. }
  50. }
  51. Rectangle {
  52. color: "#ffffff"
  53. width: parent.width
  54. height: parent.height
  55. Rectangle {
  56. id: rect_bat_head
  57. width: 30
  58. height: 10
  59. radius: 1
  60. color: "gray"
  61. anchors.horizontalCenter: parent.horizontalCenter
  62. anchors.topMargin: 3
  63. }
  64.  
  65. Rectangle {
  66. id: rect_bat_body
  67. anchors.horizontalCenter: parent.horizontalCenter
  68. anchors.top: rect_bat_head.bottom
  69. anchors.topMargin: 3
  70. width: parent.width-4
  71. height: parent.height/2
  72. color: "#ffffff"
  73. radius: 10
  74. border.width: 1
  75. border.color: "gray"
  76. Rectangle {
  77. id: rect_bat_value
  78. width: parent.width-8
  79. height: (parent.height-8)*(bat_value/100.0)
  80. anchors.bottom: parent.bottom
  81. anchors.bottomMargin: 4
  82. anchors.horizontalCenter: parent.horizontalCenter
  83. radius: 8
  84. color: colorBase
  85. }
  86. Text {
  87. id: text_bat_text
  88. anchors.centerIn: parent
  89. font.pixelSize: 15
  90. font.bold: true
  91. color: "black"
  92. text: bat_value+"% 健康"
  93. }
  94. }
  95. Grid {
  96. rows: 4
  97. columns: 2
  98. width: parent.width-4
  99. height: parent.height/2
  100. anchors.top: rect_bat_body.bottom
  101. anchors.topMargin: 3
  102. anchors.horizontalCenter: parent.horizontalCenter
  103. horizontalItemAlignment:Grid.AlignLeft
  104. verticalItemAlignment: Grid.AlignVCenter
  105. spacing: 3
  106. Rectangle {
  107. color: color1
  108. width: parent.width/3
  109. height: parent.width/3
  110. radius: width/2
  111. Text {
  112. anchors.centerIn: parent
  113. font.pixelSize: 11
  114. text: qsTr("健康")
  115. }
  116. }
  117.  
  118. Text {
  119. font.pixelSize: 13
  120. text: qsTr("t<=80%")
  121. }
  122. Rectangle {
  123. color: color2
  124. width: parent.width/3
  125. height: parent.width/3
  126. radius: width/2
  127. Text {
  128. anchors.centerIn: parent
  129. font.pixelSize: 11
  130. text: qsTr("注意")
  131. }
  132. }
  133.  
  134. Text {
  135. font.pixelSize: 13
  136. text: qsTr("90%>=t>80%")
  137. }
  138. Rectangle {
  139. color: color3
  140. width: parent.width/3
  141. height: parent.width/3
  142. radius: width/2
  143. Text {
  144. anchors.centerIn: parent
  145. font.pixelSize: 11
  146. text: qsTr("恶化")
  147. }
  148. }
  149. Text {
  150. font.pixelSize: 13
  151. text: qsTr("100%>=t>90%")
  152. }
  153. Rectangle {
  154. color: color4
  155. width: parent.width/3
  156. height: parent.width/3
  157. radius: width/2
  158. Text {
  159. anchors.centerIn: parent
  160. font.pixelSize: 11
  161. text: qsTr("故障")
  162. }
  163. }
  164. Text {
  165. font.pixelSize: 13
  166. text: qsTr("t>100%")
  167. }
  168. }
  169. }
  170. }

解读:C++访问QML有多种方式,如调用函数啥的,我都试过了,widget和qml结合的方式下,目前就c++信号触发qml信号能成功。

所有定义一个信号,并且在其回调里改变界面。

3、在ui中拖动一个quickWidget

在cpp中将其绑定成qml界面:

  1. QUrl source("qrc:/qml/Mybattery.qml");
  2. ui->quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView );
  3. ui->quickWidget->setSource(source);
  4. ui->quickWidget->setClearColor(QColor(Qt::transparent));

4、在C++中通过信号连接QML的信号

没错,你没听错,就是信号连接信号!!!

mainwindow.h中定义信号

  1. signals:
  2. void set(double value);

mainwindow.cpp中

  1. QObject *root = ui->quickWidget->rootObject();
  2. QObject::connect(this,SIGNAL(set(double)),root,SIGNAL(setBat(double)));//信号连接信号
    emit set(80);//效果上面1图
  3. emit set();//效果上面2图

注意加头文件:

#include <QQuickItem>

#include <QQuickView>

Qt widget中使用QML自定义电池的更多相关文章

  1. qt quick中qml编程语言

    Qt QML 入门 — 使用C++定义QML类型 发表于 2013 年 3 月 11 日   注册C++类 注册可实例化的类型 注册不实例化的QML类型 附带属性 注册C++类 注册可实例化的类型 如 ...

  2. 自定义的插件如何加载到Qt Designer中(详细)

    要想在Qt Designer中使用自定义控件,必须要使Qt Designer能够知道我们的自定义控件的存在.有两种方法可以把新自定义控件的信息通知给Qt Designer:“升级(promotion) ...

  3. QtQuick 中的 qml 与 Qt 的 C++

    QtQuick 可以使用内置的 JavaScript 引擎加载相应的 JS 代码,使用起来特别方便. 在 Qt 中使用 C++ 开发底层,QtQuick 用来加载.处理图像,然后使用 Qt 提供的接口 ...

  4. VS2008 Qt Designer 中自定义信号槽

    一.Qt Designer自定义槽函数 发现:在VS2008 +Qt4.7  中打开ui文件,所用的英文QT Designer工具,没有转到槽函数的功能,不如QtCreator自带的QtDesigne ...

  5. 在自定义的widget中引入图表后,运行时出现TypeError #1009错误

    本人网上查找了很多资料,其中大部分都是关于Flash中的动画效果问题,与这里的问题关系型不太大.故把问题的解决方法写在这里,与人方便,与己方便. 方法一: 1.在自定义的widget中添加如下两个方法 ...

  6. Qt开发中的实用笔记三--关于各种类的零碎知识点:

    1,QUuid()创建唯一标识码,在创建数据库实体ID和链接数据库QSqlDatabase时非常方便 2,QScrollArea与QScrollBar,如果是要在widget中添加窗口滑动QScrol ...

  7. Qt Quick编程(1)——QML的核心部分ECMAScript

    说道QML,不得不先说一下ECMAScript: ECMAScript语言的标准是由Netscape.Sun.微软.Borland等公司基于JavaScript和JScript锤炼.定义出来的. EC ...

  8. [转载]震惊!QWidget竟然可以嵌入到QML中,QMl窗口句柄竟然是这样获取

      背景 记得在初学qml时,就被大佬告知Qml的实现有两种方式“view+item”和“engine+widow”,那么能不能将QWidget嵌入到QML中来呢,我收到的答案是不可以,原因是QML的 ...

  9. QT QQuickView嵌入到QT MDI中

    在学习QT的过程中发现有一个特别炫酷的行星例子“planets”,有两种实现版本: 一种是基于Qt 3D QML(planets-qml),另一种则是基于Quick和强大的Three.js(plane ...

随机推荐

  1. pandas数据类型判断(三)数据判断

    1.函数:空值判断 1)判断数值是否为空用 pd.isna,pd.isnull,np.isnan2)判断字符串是否为空用 pd.isna,pd.isnull:3)判断时间是否为空用 pd.isna,p ...

  2. dedecms列表页使用noflag

    最近小编使用dedecms遇到列表页需要使用noflag,在网上找了一圈都是直接替换代码,试用了一下并不能解决问题. 以下是小编自己根据资料整理的...多说一句由于各个编辑器打开的方式可能代码不在这一 ...

  3. Java中装箱和拆箱的代码

    建议使用1.5或以上的jdk运行, //装箱  值类型到引用类型  int i = 10;  Object object =i;  System.out.println(object);      / ...

  4. webpack开发环境速度优化

    随着项目的增大,项目运行速度会越来越慢,导致影响开发进度.需要提升开发时代码的运行速度. 1. ScopeHoisting作用域提升 该插件在production模式下默认开启.development ...

  5. 【Redis】Linux下Redis的安装

    Redis服务安装 主要有两种方式:apt安装和编译安装. 我采用的是apt安装,系统是ubuntu18.04,Redis version 5:4.0.9-1 在 Ubuntu 系统安装 Redi 可 ...

  6. read()和write(),读和写的优化。

    读和写的优化在输入数据后输出数据十分多的情况下是十分有用的,比scanf和printf也要快. 读: int read(){ ; ; char c=getchar(); '){ if(c=='-') ...

  7. Matlab中的变量名

    在Matlab中使用save和load命令时,可能会出现变量名出错的问题. 如: save('A1.mat', 'A1'); load('A1.mat', 'A1'); 如果程序中还有名为a1的变量名 ...

  8. SpringData like关键字不起作用

    使用springdata简单查询时,like关键字不起作用 Hibernate: select article0_.oId as oId1_2_, article0_.articleAbstract ...

  9. 和小哥哥一起刷洛谷(6) 图论之SPFA算法

    关于\(spfa\) spfa伪代码: void spfa(s){ 最短路数组全部设为无限大; 队列 q; 起点s入队; s离s的距离设为零; while(队列非空){ 取出队首;弹出队首; for( ...

  10. java 面试题目(java高级架构)

    题目信息 java基础: 1. Java 基础 JDK 和 JRE 有什么区别?   Java中JDK和JRE的区别是什么?它们的作用分别是什么? == 和 equals 的区别是什么? 两个对象的 ...