zoukankan      html  css  js  c++  java
  • 模拟电池模块图形绘制。

    化成分容系统中对电池模块需要做到实时的监控,监控界面中有很多模拟电池形状的模块,主要是为了展示用,能接受到下位机上抛的实时数据。

    在没有优化之前,我们的电源模块图形是酱色儿的,如下图所示:

     用丑的一批来形容不过分吧,所以作者想着把这个图形优化一下,给客户一种赏心悦目的感觉,于是就在网上找了很多的资料,找到Qt大神liudianwu开源的一个电源模块的图形框架,并且在他的基础上结合自己的需求做了一些修改,修改后的图形如下图所示:

    这样一对比是不是好看多了?

    下面我把我修改的地方贴出来,希望对各位读者有一定的帮助,如果有做的不好的地方还请各位读者指正,如果有更多的方式可以评论一起讨论。谢谢。

    首先是ui_frmbattery.h布局这一块添加了一些QLabel。

        QLabel  *CapaShow;   //电池容量展示
        QLabel  *PercentageShow;  //百分比
    
        QLabel  *channelName;    //通道名
        QLabel  *channelNo;      //通道号
        QLabel  *StepType;       //工步类型
    
        QLabel  *volNumUnit;         //电压数单位
        QLabel  *volNum;             //电压数
    
        QLabel  *CurrentNumUnit;     //电流数单位
        QLabel  *CurrentNum;         //电流数
    
        QLabel  *CapaNumUnit;        //电容数单位
        QLabel  *CapaNum;            //电容数
    
        QLabel  *R_TName;            //r_t
        QLabel  *R_T;
    
        QLabel  *StepNumUnit;        //
        QLabel  *StepNum;
    
        void setupUi(QWidget *frmBattery)
        {
            if (frmBattery->objectName().isEmpty())
                frmBattery->setObjectName(QStringLiteral("frmBattery"));
            frmBattery->resize(350, 500);
            battery = new Battery(frmBattery);
            battery->setObjectName(QStringLiteral("battery"));
            battery->setGeometry(QRect(9, 9, 257, 482));
            horizontalSlider = new QSlider(frmBattery);
            horizontalSlider->setObjectName(QStringLiteral("horizontalSlider"));
            //horizontalSlider->setGeometry(QRect(9, 475, 255, 19));
            horizontalSlider->setGeometry(QRect(300, 9, 19, 450));
            horizontalSlider->setMaximum(100);
            horizontalSlider->setOrientation(Qt::Vertical);
            horizontalSlider->setInvertedControls(false);
    
            CapaShow = new QLabel(frmBattery);
            CapaShow->setText("Capacity");
            CapaShow->setGeometry(QRect(127, 50, 50, 20));
            retranslateUi(frmBattery);
    
            PercentageShow = new QLabel(frmBattery);
            PercentageShow->setText("%");
            PercentageShow->setGeometry(QRect(147, 50, 50, 20));
            retranslateUi(frmBattery);
    
            channelName = new QLabel(frmBattery);
            channelName->setText("通道 -");
            channelName->setGeometry(QRect(60, 80, 50, 20));
    
            channelNo = new QLabel(frmBattery);
            channelNo->setText("1");
            channelNo->setGeometry(QRect(95, 80, 50, 20));
    
            StepType = new QLabel(frmBattery);
            StepType->setText("无工步");
            StepType->setGeometry(QRect(180, 80, 50, 20));
    
    
            volNumUnit = new QLabel(frmBattery);
            volNumUnit->setText("U(mV)");
            volNumUnit->setGeometry(QRect(60, 110, 50, 20));
    
            volNum = new QLabel(frmBattery);
            volNum->setText("0.0");
            volNum->setGeometry(QRect(180, 110, 50, 20));
    
    
            CurrentNumUnit = new QLabel(frmBattery);
            CurrentNumUnit->setText("I(mA)");
            CurrentNumUnit->setGeometry(QRect(60, 150, 50, 20));
    
            CurrentNum = new QLabel(frmBattery);
            CurrentNum->setText("0.0");
            CurrentNum->setGeometry(QRect(180, 150, 50, 20));
    
            CapaNumUnit = new QLabel(frmBattery);
            CapaNumUnit->setText("C(mAh)");
            CapaNumUnit->setGeometry(QRect(60, 190, 50, 20));
    
            CapaNum = new QLabel(frmBattery);
            CapaNum->setText("0.0");
            CapaNum->setGeometry(QRect(180, 190, 50, 20));
    
            R_TName = new QLabel(frmBattery);
            R_TName->setText("R_T");
            R_TName->setGeometry(QRect(60, 230, 50, 20));
    
            R_T = new QLabel(frmBattery);
            R_T->setText("");
            R_T->setGeometry(QRect(180, 230, 50, 20));
    
            CapaNumUnit = new QLabel(frmBattery);
            CapaNumUnit->setText("Step");
            CapaNumUnit->setGeometry(QRect(60, 270, 50, 20));
    
            CapaNum = new QLabel(frmBattery);
            CapaNum->setText("0");
            CapaNum->setGeometry(QRect(180, 270, 50, 20));

    字体还是沿用大神的微软雅黑,我这边做了加粗的处理,就是QFont的最后一个参数,75。

        QApplication a(argc, argv);
        a.setFont(QFont("Microsoft Yahei", 9, 75));

    电量的展示用到了信号和槽的机制,滑动滚动条,QLabel中的数据也会随着改变。

        connect(ui->horizontalSlider, SIGNAL(valueChanged(int)), ui->CapaShow, SLOT(setNum(int)));

    电池边框的设计是酱色儿的。

    void Battery::drawBorder(QPainter *painter)
    {
           painter->save();
    
           double headHeight = height() / 10;
           double batteryHeight = height() - headHeight;
    
           //绘制电池边框
           QPointF topLeft(5, 25);
           QPointF bottomRight(width() - 5,batteryHeight);
           batteryRect = QRectF(topLeft, bottomRight);
    
           painter->setPen(QPen(borderColorStart, 5));
           painter->setBrush(Qt::NoBrush);
           painter->drawRoundedRect(batteryRect, borderRadius, borderRadius);
    
           painter->restore();
    }

    电池背景的设计是酱色儿的。

    void Battery::drawBg(QPainter *painter)
    {
        painter->save();
    
        QLinearGradient batteryGradient(QPointF(0, 0), QPointF(0, height()));
        if (currentValue <= alarmValue) {
            batteryGradient.setColorAt(0.0, alarmColorStart);
            batteryGradient.setColorAt(1.0, alarmColorEnd);
        } else {
            batteryGradient.setColorAt(0.0, normalColorStart);
            batteryGradient.setColorAt(1.0, normalColorEnd);
        }
    
        int margin = qMin(width(), height()) / 20;
        double unit = (batteryRect.height() - (2 * 2)) / 100;
        double height = currentValue * unit;
        QPointF topLeft(batteryRect.bottomLeft().x() + 3.5, batteryRect.bottomLeft().y() - height - 3.5);
        QPointF bottomRight(batteryRect.bottomRight().x() - 3.5, batteryRect.bottomRight().y()- 3.5);
        QRectF rect(topLeft, bottomRight);
    
        painter->setPen(Qt::NoPen);
        painter->setBrush(batteryGradient);
        painter->drawRoundedRect(rect, bgRadius, bgRadius);
    
        painter->restore();
    }

    电池头的设计是酱色儿的。

    void Battery::drawHead(QPainter *painter)
    {
        painter->save();
    
        QPointF headRectTopLeft(width() / 3 , batteryRect.topLeft().y() - 15);
        QPointF headRectBottomRight(width() - width() / 3, batteryRect.topLeft().y());
        QRectF headRect(headRectTopLeft, headRectBottomRight);
    
        QLinearGradient headRectGradient(headRect.topLeft(), headRect.bottomLeft());
        headRectGradient.setColorAt(0.0, borderColorStart);
        headRectGradient.setColorAt(1.0, borderColorEnd);
    
        painter->setPen(Qt::NoPen);
        painter->setBrush(headRectGradient);
        painter->drawRoundedRect(headRect, headRadius, headRadius);
    
        painter->restore();
    }

    以上三部分是本次修改的重要部分。

    最后,感谢Qt大神liudianwu的开源。

  • 相关阅读:
    同样功能的SQL语句,写成参数和写成常量怎么效率会有那么大的差别
    遭遇钓鱼网站
    SQL Server 2005与Oracle同步注意NUMBER类型转换
    Oracle数据类型(转)
    如何使用枚举的组合值
    社保,交得越多亏得越多(转)
    使用OPENXML函数将XML文档转换为行结果集
    发布一个性能测试工具的破解补丁
    如何将SQLServer2005中的数据同步到Oracle中
    Repository模式
  • 原文地址:https://www.cnblogs.com/joorey/p/14836115.html
Copyright © 2011-2022 走看看