PyQt5+QML实现仪表组件

写在开头

最近公司给了个任务,让我当辅助,跟一个公司前辈写上位机,底层都是前辈写好的,领导想要加仪表到上位机做显示,之前看QT的例子程序里面的油表,我个人挺喜欢黑背景的东西,所以想直接把这个搬过来用,原来没有学过python(因为前辈的底层都是用python写的),没有学过QML,所以都要从语言学起,不过这对于我这刚毕业的还是很有好处的,之前在知乎上看到一篇文章,多学几门编程语言你就会慢慢发现各个语言的优缺点,在做项目的时候可选择性也更高。
好了,进入主题。学习pyqt的时候,有看到过怎样与QML交互的,但是大多数都是QML写个界面,然后PyQt建一个应用程序,加载QML文件,显示,就没了,我想要的效果是QML文件当作一个UI界面的控件来使用。

正题

我先理一下思路。。。。该从哪里开始写。。。。
我想写这篇文章的重点就是总结一下QML的使用,还有就是QML与pyqt的交互,那就先总结QML吧。有关QML的中文资料可以参考QMLBookInChinese

用QML写个界面

之前都用习惯了图形化界面(qtdesigner)来设计界面,真的不习惯这种纯代码的方式来建界面,我直接贴一个界面代码慢慢讲

import QtQuick 2.0
import QtQuick.Window 2.0

Window {
    id:root
    visible: true
    width: 640
    height: 480
    //color: "blue"
    title: qsTr("Hello World")

    Rectangle{           //创建一个矩形框
        id:add
        x:0;y:0;
        width: 50
        height: 20
        radius: 20       //圆角半径
        color:"steelblue"
        property real speed_value: 0
        Text{
            anchors.centerIn: parent  //锚定到父类的中心
            text:"+10"
        }

        MouseArea{
            anchors.fill: parent      //填充整个父类
            onClicked:                //槽函数
                add.speed_value+=10
        }
    }

    Rectangle{
        id:minus
        x:50;y:0;
        width: 50
        height: 20
        radius: 20
        color:"gray"
        property real speed_value: 0
        Text{
            anchors.centerIn: parent
            text:"-10"
        }

        MouseArea{
            anchors.fill: parent
            onClicked:
                add.speed_value-=10
        }
    }

    Meter{                         //仪表组件
        anchors.centerIn: parent   //锚定到窗口中心
        width: Math.min(root.width,root.height)/2
        height: Math.min(root.width,root.height)/2
        meterMaxValue: 500
        meterMinValue: -500
        underMeterText: "V"
        meter_value: add.speed_value
    }
}

好像…这个高亮很奇怪啊,不支持QML的语法吗?
好了好了,又跑偏了,有关QML的语法我就不讲了,我也讲不清楚,要看懂还是挺容易的。
首先!window,顾名思义,创建一个窗口,这个窗口是可见的visible: true,然后设置窗口的长宽width: 640;height: 480,顺便提一下,QML是支持分号的。设置窗口的标题title: qsTr("Hello World")
Rectangle创建一个矩形区域,每个组件都可以设置一个id:,这个id在一个QML文件中应该是唯一的。然后设置长宽,不设置长宽是看不到矩形的,而且基于该矩形区域的其他组件也无效。radius: 20设置矩形的圆角半角,这样就可以生成一个圆角矩形,不再是方方正正的了,color:steelblue设置矩形框的颜色。Text在矩形区域中显示文本,anchors.centerIn: parent锚定到父类的中心,有关锚定的概念自己看书。
MouseArea在矩形区域中创建一个鼠标区域,anchors.fill: parent填充整个父类,意思就是整个矩形区域都是鼠标的可操作区域。咦,忘了讲这个了property real speed_value: 0定义个real类型的变量,property关键字的意思就是外部可以访问这个变量。
Meter是我自己封装好的仪表组件,里面的变量看名字都很好理解,我就就不一一解释了。
至此我们可以用QTCreator的工具qmlsence看看效果,工具->外部->Qt Quick 2 preview。

实现仪表盘和Bar数据显示及更新需要一定的编程基础和相关知识,下面是一个简单的示例代码供参考: ```python import sys import random from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout from PyQt5.QtCore import QTimer from pyecharts.charts import Gauge, Bar from pyecharts import options as opts class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 创建垂直布局 vbox = QVBoxLayout(self) # 创建仪表盘对象 self.gauge = Gauge() self.gauge.add("", [("Value", 0)]) self.gauge.set_global_opts(title_opts=opts.TitleOpts(title="Gauge Demo")) # 创建柱状图对象 self.bar = Bar() self.bar.add_xaxis(["A", "B", "C", "D", "E"]) self.bar.add_yaxis("Data", [0, 0, 0, 0, 0]) # 将仪表盘和柱状图添加到布局中 vbox.addWidget(self.gauge) vbox.addWidget(self.bar) # 创建定时器,每隔1秒更新数据 self.timer = QTimer() self.timer.timeout.connect(self.updateData) self.timer.start(1000) # 设置窗口大小和标题 self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Dashboard Demo') self.show() def updateData(self): # 更新仪表盘数据 value = random.randint(0, 100) self.gauge.render_notebook().add("", [("Value", value)], is_update=True) # 更新柱状图数据 data = [random.randint(0, 100) for i in range(5)] self.bar.render_notebook().add_yaxis("Data", data, is_update=True) if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) ``` 需要注意的是,上述代码中的数据更新是通过重新渲染图表实现的,因此需要使用 `render_notebook()` 方法获取图表对象并设置 `is_update=True` 参数。如果需要在实际应用中使用,可以将 `render_notebook()` 替换为 `render()` 并指定输出文件路径。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值