因為工作需要,需要實現溫度的表盤展示效果
實現思路:
? ?通過提示聲QLabel控價類,實現報盤的旋轉和展示效果
1. 編寫一個QLabel的類MyQLabel,實現兩個方法
? ?1.? void paintEvent(QPaintEvent *event); //重繪函數
? ?2.??void valueChanged(int value); //更改值
2.提升QLabel控件,實現兩個方法函數的重置入
3. 通過按鈕和滑動條,改變數值,實現指針的轉動調整指針的指向
實現表盤轉動的功能。
myqlabel.h
#ifndef MYQLABEL_H
#define MYQLABEL_H
#include <QObject>
#include <QLabel>
#include <QPainter>
class MyQLabel : public QLabel
{
Q_OBJECT
public:
QPixmap needle; //指針
QPixmap overlay; //中間顯示盤
QPixmap img; //顯示轉盤
int nvalue;
explicit MyQLabel(QWidget *parent=0);
void paintEvent(QPaintEvent *event); //重繪函數
void valueChanged(int value); //更改值
//void DrawRangle(int x ,int y ,int h,int w); //繪制矩形
};
#endif // MYQLABEL_H
2. myqlabel.c文件內容
#include "myqlabel.h" #include <QDebug> MyQLabel::MyQLabel(QWidget *parent): QLabel(parent) {needle = QPixmap(":/image/ned.png");overlay= QPixmap(":/image/lay.png");img = QPixmap(":/image/img.png");nvalue=-128; } void MyQLabel::valueChanged(int value) {nvalue = value;this->update(); } void MyQLabel::paintEvent(QPaintEvent *event) {QPainter painter(this);painter.save();//保存painter.setRenderHint(QPainter::SmoothPixmapTransform, true); //平滑像素圖,防止圖形走樣painter.translate(this->width() / 2,this->height() / 2); // 原點定位在中間位置qDebug()<<"1.width:"<<this->width()/2 <<"height:"<<this->height()/2 <<endl;painter.drawPixmap(-img.width()/2, -img.height() / 2, img); // 背景圖qDebug()<<"2.width:"<<img.width() <<"height:"<<img.height() <<endl;// 指針圖painter.restore();//恢復painter.translate(this->width() / 2,this->height()/8*5); // 原點定位在中間位置qDebug()<<"3.定位點.width:"<<this->width() / 2 <<"height:"<<this->height() /8*5<<endl;painter.rotate(nvalue);//設置旋轉角度painter.drawPixmap(-needle.width() / 2, -needle.height() + needle.width() / 2, needle); //原點圖painter.drawPixmap(-overlay.width() / 2, -overlay.height()/2 , overlay);painter.restore();//恢復 }
3. widget.h 文件
#include <QWidget>
#include <QPaintDevice>
#include <QPainter>
#include <QPaintEvent>
#include <QPixmap>
#include <QInputDialog>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_pushButton_clicked();
void on_slider_valueChanged(int value);
private:
?Ui::Widget *ui;
};
#endif // WIDGET_H
4. widget.cpp
#include "ui_widget.h"
#include <QDebug>
#include <QLabel>
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
? ? ? ui->setupUi(this);
? ? ?resize(600,600); //設置窗體大小
}
//析構函數
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
int evalue=QInputDialog::getInt(this,tr("輸入溫度數值"),tr("請輸入一個對應的溫度值"),0,-128,128,1);
ui->label->valueChanged(evalue);
}
//值變化時
void Widget::on_slider_valueChanged(int value)
{
qDebug()<<"value="<<value<<endl;
ui->label->valueChanged(value);
}
5. main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
6. widget.ui
這個界面中放置一個QLabel控價,到時提升下控件即可
最終實現效果如下