HMI-20-[刷新问题]解决界面刷新卡顿问题

简介: 基于Qt的汽车仪表模拟

image.png

点此链接查看视频

image.png

先描述现象,就是我的这两个表转速表和速度表,他们按照正常的是同时开始转,完了再同时回到起点,但是呢,我在其他的电脑上实验的时候,发现会有不同步显现,特别明显。


所以,我担心是我的频繁刷新导致的,因为我的刷新频率太高了


每个表里面有两个定时器,定时10毫秒,每个定时器对应的操作里面都有updata这样等于我一个表每秒就要刷新100*100 次,两个表,同时刷新,那就是100*100*100*100 ,着个刷新频率可能真的是太高了,


剩下的呢,就是把原来的仪表的自检函数优化,增加线程,完美解决问题。但是目前的版本还是没有优化的版本,


看下修改后的代码吧,修改之前的改吗可以看前面的内容


 

#ifndef TACHOMETER_H
#define TACHOMETER_H
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QThread>
class TachoThread :  public QThread
{
    Q_OBJECT
public:
    /**
     * @brief run
     * 重载线程函数
     */
    virtual void run();
signals:
    void signal_selfInspection(int number);
    void signal_finished();
private:
    int m_number = 0;
    bool flagDESC = false;
};
namespace Ui {
class Tachometer;
}
class Tachometer : public QWidget
{
    Q_OBJECT
public:
    explicit Tachometer(QWidget *parent = 0);
    ~Tachometer();
    /**
     * @brief selfInspection
     * 转速表自检程序
     */
    void selfInspection();
    /**
     * @brief setTacho
     * @param tacho
     * 设置发动机转速0-8000 转速
     */
    void setTacho(int tacho = 0);
    /**
     * @brief setTemperature
     * @param temperatur
     * 设置温度
     */
    void setTemperature(int temperatur = 0);
signals:
    /**
     * @brief signalSelfInspection
     *  自检完成信号
     */
    void signalSelfInspectionfinished();
private:
    /**
     * @brief eventFilter
     * @param watched
     * @param event
     * @return
     * 事件过滤器器
     */
    bool eventFilter(QObject *watched, QEvent *event);
    /**
     * @brief drawPonter
     * @param angle
     * 绘制指针
     */
    void drawPonter(int angle = -135);
    /**
     * @brief drawPonterShade
     * @param angle
     * 绘制指针阴影
     */
    void drawPonterShade(int angle = -135);
    /**
     * @brief drawTemperature
     * @param temperature
     * 绘制温度表
     */
    void drawTemperature(int temperature = 0); 
private slots:
    /**
     * @brief slot_tachoSelfInspection
     * @param number
     * 完成自检动画
     */
    void slot_tachoSelfInspection(int number);
public:
    int currentTacho = 0;           //当前转速
    int currentTemperature = 0;     //当前温度
private:
    Ui::Tachometer *ui;
    int m_Angle = 0;            //转速表角度
    int m_Temperature = 0;
    double m_shadeOpacity = 0.0;    //指针阴影透明度
    TachoThread *m_tachoThread = NULL;
};
#endif // TACHOMETER_H
#include "tachometer.h"
#include "ui_tachometer.h"
#include <QDebug>
Tachometer::Tachometer(QWidget *parent) :QWidget(parent),ui(new Ui::Tachometer)
{
    ui->setupUi(this);
    ui->label_mainback->setStyleSheet("QLabel{border-image:url(:/Comfort/Resources/MeterDisplay/Comfort/Tachometer/mainback.png);}");
    ui->label_flag_temperature->setStyleSheet("QLabel{border-image:url(:/Comfort/Resources/MeterDisplay/Comfort/Tachometer/temperature_r.png);}");
    ui->label_pointer->installEventFilter(this);
    ui->label_pointer_shade->installEventFilter(this);
    ui->label_pointer_temperature->installEventFilter(this);
    m_tachoThread = new TachoThread();
    connect(m_tachoThread,&TachoThread::signal_finished,this,[=](){m_tachoThread->terminate();});
    connect(m_tachoThread,&TachoThread::signal_selfInspection,this,&Tachometer::slot_tachoSelfInspection);
    setTacho();
}
Tachometer::~Tachometer()
{
    delete ui;
}
void Tachometer::selfInspection()
{
    if(m_tachoThread)
    {
        m_tachoThread->start();
    }
}
void Tachometer::setTacho(int tacho)
{
    currentTacho = tacho;
    m_Angle = currentTacho*0.03375-135;
    update();
}
void Tachometer::setTemperature(int temperatur)
{
    currentTemperature = temperatur;
    m_Temperature = temperatur;
    if(m_Temperature >75)
    {
        ui->label_flag_temperature->setStyleSheet("QLabel{border-image:url(:/Comfort/Resources/MeterDisplay/Comfort/Tachometer/temperature_r.png);}");
    }
    else
    {
        ui->label_flag_temperature->setStyleSheet("QLabel{border-image:url(:/Comfort/Resources/MeterDisplay/Comfort/Tachometer/temperature_w.png);}");
    }
    update();
}
bool Tachometer::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->label_pointer && event->type() == QEvent::Paint)
    {
        drawPonter(m_Angle);
    }
    if(watched == ui->label_pointer_shade && event->type() == QEvent::Paint)
    {
        drawPonterShade(m_Angle);
    }
    if(watched == ui->label_pointer_temperature && event->type() == QEvent::Paint)
    {
        drawTemperature(m_Temperature);
    }
    return QWidget::eventFilter(watched,event);
}
void Tachometer::drawPonter(int angle)
{
    m_shadeOpacity = currentTacho / 10000.0;
    QPainter painter(ui->label_pointer);
    painter.setRenderHint((QPainter::SmoothPixmapTransform));
    painter.setRenderHint(QPainter::HighQualityAntialiasing);
    painter.translate(304,303.5);
    painter.save();
    painter.rotate(angle);
    painter.drawPixmap(-304,-302,416,500,QPixmap(":/Comfort/Resources/MeterDisplay/Comfort/Tachometer/pointer.png"));
    painter.restore();
}
void Tachometer::drawPonterShade(int angle)
{
    QPainter painter(ui->label_pointer_shade);
    painter.setOpacity(m_shadeOpacity);
    painter.setRenderHint((QPainter::SmoothPixmapTransform));
    painter.setRenderHint(QPainter::HighQualityAntialiasing);
    painter.translate(304,303.5);
    painter.save();
    painter.rotate(angle);
    painter.drawPixmap(-304,-302,416,500,QPixmap(":/Comfort/Resources/MeterDisplay/Comfort/Tachometer/pointer_shade.png"));
    painter.restore();
}
void Tachometer::drawTemperature(int temperature)
{
    QPainter painter(ui->label_pointer_temperature);
    painter.setRenderHint((QPainter::SmoothPixmapTransform));
    painter.setRenderHint(QPainter::HighQualityAntialiasing);
    painter.translate(304,303.5);
    painter.setPen(QPen(Qt::white,6,Qt::SolidLine));
    painter.save();
    if(temperature<=25)
    {
        painter.drawArc(-304,-308,608,608,247*16,temperature*7);
    }
    else if(temperature>25 && temperature <= 50)
    {
        painter.drawArc(-304,-308,608,608,247*16,24*7);
        painter.drawArc(-304,-308,608,608,259*16,(temperature-25)*7);
    }
    else if(temperature>50 && temperature <= 75)
    {
        painter.drawArc(-304,-308,608,608,247*16,24*7);
        painter.drawArc(-304,-308,608,608,259*16,24*7);
        painter.drawArc(-304,-308,608,608,271*16,(temperature-50)*7);
    }
    else if(temperature>75 && temperature <= 90)
    {
        painter.drawArc(-304,-308,608,608,247*16,24*7);
        painter.drawArc(-304,-308,608,608,259*16,24*7);
        painter.drawArc(-304,-308,608,608,271*16,24*7);
        painter.drawArc(-304,-308,608,608,283*16,(temperature-75)*7);
    }
    else if(temperature>90 && temperature <= 100)
    {
        painter.drawArc(-304,-308,608,608,247*16,24*7);
        painter.drawArc(-304,-308,608,608,259*16,24*7);
        painter.drawArc(-304,-308,608,608,271*16,24*7);
        painter.drawArc(-304,-308,608,608,283*16,15*7);
        painter.setPen(QPen(Qt::red,6,Qt::SolidLine));
        painter.drawArc(-304,-308,608,608,290*16,(temperature-90)*7);
    }
    painter.restore();
}
void Tachometer::slot_tachoSelfInspection(int number)
{
    currentTacho = number*80;
    m_Angle = number*80*0.03375-135;
    setTemperature(number);
}
void TachoThread::run()
{
    while (true)
    {
        emit signal_selfInspection(m_number);
        if(flagDESC)
        {
            if(m_number == 0)
            {
                emit signal_finished();
                flagDESC = !flagDESC;
            }
            m_number--;
        }
        else
        {
            m_number++;
            if(m_number == 100)
            {
                flagDESC = !flagDESC;
            }
        }
        msleep(10);
    }
}
#ifndef SPEEDMETER_H
#define SPEEDMETER_H
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QThread>
class SpeedThread :  public QThread
{
    Q_OBJECT
public:
    /**
     * @brief run
     * 重载线程函数
     */
    virtual void run();
signals:
    void signal_selfInspection(int number);
    void signal_finished();
private:
    int m_number = 0;
    bool flagDESC = false;
};
namespace Ui {
class Speedmeter;
}
class Speedmeter : public QWidget
{
    Q_OBJECT
public:
    explicit Speedmeter(QWidget *parent = 0);
    ~Speedmeter();
    /**
     * @brief selfInspection
     * 转速表自检程序
     */
    void selfInspection();
    /**
     * @brief setCarSpeed
     * @param speed
     * 设置车速
     */
    void setCarSpeed(int speed = 0);
    /**
     * @brief setOilMass
     * @param mass
     * 设置油量
     */
    void setOilMass(int mass = 0);
signals:
    /**
     * @brief speedChange
     * @param speed
     * 速度改变信号
     */
    void speedChange(int speed);
    /**
     * @brief signalSelfInspection
     *  自检完成信号
     */
    void signalSelfInspectionfinished();
private:
    /**
     * @brief eventFilter
     * @param watched
     * @param event
     * @return
     * 事件过滤器器
     */
    bool eventFilter(QObject *watched, QEvent *event);
    /**
     * @brief drawPonter
     * @param angle
     * 绘制指针
     */
    void drawPonter(int angle = -135);
    /**
     * @brief drawPonterShade
     * @param angle
     * 绘制指针阴影
     */
    void drawPonterShade(int angle = -135);
    /**
     * @brief drawOilMass
     * @param mess
     * 绘制油量表
     */
    void drawOilMass(int mass = 0);
private slots:
    /**
     * @brief slot_tachoSelfInspection
     * @param number
     * 完成自检动画
     */
    void slot_carSpeedSelfInspection(int number);
public:
    int currentCarSpeed = 0;        //当前车速
    int currentMass = 0;            //当前油量
private:
    Ui::Speedmeter *ui;
    int m_Angle = 0;            //速度角度
    double m_shadeOpacity = 0.0;    //指针阴影透明度
    int m_OilMass = 0;
    SpeedThread *m_speedThread = NULL;
};
#endif // SPEEDMETER_H
#include "speedmeter.h"
#include "ui_speedmeter.h"
#include <QDebug>
Speedmeter::Speedmeter(QWidget *parent) : QWidget(parent),ui(new Ui::Speedmeter)
{
    ui->setupUi(this);
    ui->label_mainback->setStyleSheet("QLabel{border-image:url(:/Comfort/Resources/MeterDisplay/Comfort/Speedmeter/mainback.png);}");
    ui->label_flag_oilmass->setStyleSheet("QLabel{border-image:url(:/Comfort/Resources/MeterDisplay/Comfort/Speedmeter/oilmass_o.png);}");
    ui->label_pointer->installEventFilter(this);
    ui->label_pointer_shade->installEventFilter(this);
    ui->label_oilmass->installEventFilter(this);
    m_speedThread = new SpeedThread();
    connect(m_speedThread,&SpeedThread::signal_finished,this,[=](){m_speedThread->terminate();});
    connect(m_speedThread,&SpeedThread::signal_selfInspection,this,&Speedmeter::slot_carSpeedSelfInspection);
    setCarSpeed();
}
Speedmeter::~Speedmeter()
{
    delete ui;
}
void Speedmeter::selfInspection()
{
    if(m_speedThread)
    {
        m_speedThread->start();
    }
}
void Speedmeter::setCarSpeed(int speed)
{
    currentCarSpeed = speed;
    emit speedChange(currentCarSpeed);
    m_Angle = currentCarSpeed*1.125-135;
    update();
}
void Speedmeter::setOilMass(int mass)
{
    if(mass<=10)
    {
        ui->label_flag_oilmass->setStyleSheet("QLabel{border-image:url(:/Comfort/Resources/MeterDisplay/Comfort/Speedmeter/oilmass_o.png);}");
    }
    else
    {
        ui->label_flag_oilmass->setStyleSheet("QLabel{border-image:url(:/Comfort/Resources/MeterDisplay/Comfort/Speedmeter/oilmass_w.png);}");
    }
    m_OilMass = mass;
    update();
}
bool Speedmeter::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->label_pointer && event->type() == QEvent::Paint)
    {
        drawPonter(m_Angle);
    }
    if(watched == ui->label_pointer_shade && event->type() == QEvent::Paint)
    {
        drawPonterShade(m_Angle);
    }
    if(watched == ui->label_oilmass && event->type() == QEvent::Paint)
    {
        drawOilMass(m_OilMass);
    }
    return QWidget::eventFilter(watched,event);
}
void Speedmeter::drawPonter(int angle)
{
    m_shadeOpacity = currentCarSpeed / 300.0;
    QPainter painter(ui->label_pointer);
    painter.setRenderHint((QPainter::SmoothPixmapTransform));
    painter.setRenderHint(QPainter::HighQualityAntialiasing);
    painter.translate(305,303.5);
    painter.save();
    painter.rotate(angle);
    painter.drawPixmap(-304,-302,416,500,QPixmap(":/Comfort/Resources/MeterDisplay/Comfort/Speedmeter/pointer.png"));
    painter.restore();
}
void Speedmeter::drawPonterShade(int angle)
{
    QPainter painter(ui->label_pointer_shade);
    painter.setOpacity(m_shadeOpacity);
    painter.setRenderHint((QPainter::SmoothPixmapTransform));
    painter.setRenderHint(QPainter::HighQualityAntialiasing);
    painter.translate(305,303.5);
    painter.save();
    painter.rotate(angle);
    painter.drawPixmap(-304,-302,416,500,QPixmap(":/Comfort/Resources/MeterDisplay/Comfort/Speedmeter/pointer_shade.png"));
    painter.restore();
}
void Speedmeter::drawOilMass(int mass)
{
    QPainter painter(ui->label_oilmass);
    painter.setRenderHint((QPainter::SmoothPixmapTransform));
    painter.setRenderHint(QPainter::HighQualityAntialiasing);
    painter.translate(305,303.5);
    painter.setPen(QPen(Qt::white,6,Qt::SolidLine));
    painter.save();
    if(mass<=10)
    {
        painter.setPen(QPen(Qt::red,6,Qt::SolidLine));
        painter.drawArc(-304,-308,608,608,247*16,mass*7);
    }
    else if(mass>10 && mass<=25)
    {
        painter.setPen(QPen(Qt::white,6,Qt::SolidLine));
        painter.drawArc(-304,-308,608,608,247*16,mass*7);
    }
    else if(mass>25 && mass <= 50)
    {
        painter.setPen(QPen(Qt::white,6,Qt::SolidLine));
        painter.drawArc(-304,-308,608,608,247*16,24*7);
        painter.drawArc(-304,-308,608,608,259*16,(mass-25)*7);
    }
    else if(mass>50 && mass <= 75)
    {
        painter.setPen(QPen(Qt::white,6,Qt::SolidLine));
        painter.drawArc(-304,-308,608,608,247*16,24*7);
        painter.drawArc(-304,-308,608,608,259*16,24*7);
        painter.drawArc(-304,-308,608,608,271*16,(mass-50)*7);
    }
    else if(mass>75 && mass <= 100)
    {
        painter.setPen(QPen(Qt::white,6,Qt::SolidLine));
        painter.drawArc(-304,-308,608,608,247*16,24*7);
        painter.drawArc(-304,-308,608,608,259*16,24*7);
        painter.drawArc(-304,-308,608,608,271*16,24*7);
        painter.drawArc(-304,-308,608,608,283*16,(mass-75)*7);
    }
    painter.restore();
}
void Speedmeter::slot_carSpeedSelfInspection(int number)
{
    m_OilMass = number;
    setCarSpeed(number*2.4);
}
void SpeedThread::run()
{
    while (true)
    {
        emit signal_selfInspection(m_number);
        if(flagDESC)
        {
            if(m_number == 0)
            {
                emit signal_finished();
                flagDESC = !flagDESC;
            }
            m_number--;
        }
        else
        {
            m_number++;
            if(m_number == 100)
            {
                flagDESC = !flagDESC;
            }
        }
        msleep(10);
    }
}


目录
相关文章
|
Linux iOS开发 MacOS
DBeaver用户界面窗口失效 查询窗口不显示
DBeaver用户界面窗口失效 查询窗口不显示
|
小程序 开发者 异构计算
小程序真机调试反应很慢卡顿,界面跳转之后,页面出现空白,无法点击等问题解决方案
小程序真机调试反应很慢卡顿,界面跳转之后,页面出现空白,无法点击等问题解决方案
1039 0
小程序真机调试反应很慢卡顿,界面跳转之后,页面出现空白,无法点击等问题解决方案
|
28天前
|
搜索推荐
【sgUploadTray_v2】自定义组件:升级版上传托盘自定义组件,可实时查看上传列表进度,可以通过选项卡切换上传中、成功、失败的队列,支持翻页,解决了列表内容太多导致卡顿的情况。(一)
【sgUploadTray_v2】自定义组件:升级版上传托盘自定义组件,可实时查看上传列表进度,可以通过选项卡切换上传中、成功、失败的队列,支持翻页,解决了列表内容太多导致卡顿的情况。
【sgUploadTray_v2】自定义组件:升级版上传托盘自定义组件,可实时查看上传列表进度,可以通过选项卡切换上传中、成功、失败的队列,支持翻页,解决了列表内容太多导致卡顿的情况。(一)
|
9月前
|
存储 缓存 固态存储
三分钟解决AE缓存预览渲染错误、暂停、卡顿问题
三分钟解决AE缓存预览渲染错误、暂停、卡顿问题
598 2
|
编解码 Java Android开发
Launcher 桌面布局右侧不满屏代码跟踪记录
Launcher 桌面布局右侧不满屏代码跟踪记录
63 0
|
开发者
uniapp中showToast之后延迟跳转页面,解决提示在真机中一闪而过
请求接口需要调用 uni.showLoading(),接口请求结束调用 uni.hideLoading(),满足需求条件后调用 uni.showToast()给用户提示信息,在开发者上正常,但是在真机上会出现提示信息一闪而过。
1073 0
|
人工智能 JavaScript 前端开发
小程序实现页面多级来回切换支持滑动和点击操作
想留住粉丝,就必须安排演示: [审核中…]然后开摆!!!!首先通过swiper创建一个简单的多tab页面 通过触发pagechange1方法中的事件对currentIndex来进行赋值,又通过currentIndex的改变使前端wxml对应更改,这个部分对滑动和点击的操作都一样,无非就是使currentIndex对应到各自的位置,通过数字来决定位置 这个部分完整代码如下: wxml wxss js 上一步完成后,下级页面再加一个滑动页面,当内切换结束后,在做切换就是父级的切换操作 在“内容1”的vie
235 0
小程序实现页面多级来回切换支持滑动和点击操作
IDEA 底下的indexing一直自动刷新刷新刷新刷新的解决方案
IDEA 底下的indexing一直自动刷新刷新刷新刷新的解决方案
727 0
IDEA 底下的indexing一直自动刷新刷新刷新刷新的解决方案
|
iOS开发
iOS 跳转到二级页面时tabbar延迟几秒消失问题解决方法
iOS 跳转到二级页面时tabbar延迟几秒消失问题解决方法
430 0
|
缓存 数据处理 异构计算
屏幕刷新机制简单问(没有代码,请放心享用)
周一好呀,今天给大家带来一点轻松简单的内容,没有代码,请享用~
239 0
屏幕刷新机制简单问(没有代码,请放心享用)