
先描述現象,就是我的這兩個表轉速表和速度表,他們按照正常的是同時開始轉,完了再同時回到起點,但是呢,我在其他的電腦上實驗的時候,發現會有不同步顯現,特别明顯。
是以,我擔心是我的頻繁重新整理導緻的,因為我的重新整理頻率太高了
每個表裡面有兩個定時器,定時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);
}
}