第一種方法:
1.需要重載QLabel。
2.重載QPainter
下面是我寫的一個畫在label上的隨滑動條變化的指針盤。


1 #include "mylabel.h" 2 //重載的QLabel為自己的 3 myLabel::myLabel(QWidget *parent) 4 :QLabel(parent),valueSlider(0) 5 { 6 //在label上加圖片 7 this->setStyleSheet("border-image: url(:/image/1.png)"); 8 //滑動條 9 _slider = new QSlider(this); 10 _slider->setRange(0,200); 11 _slider->setOrientation(Qt::Horizontal); 12 connect(_slider,SIGNAL(valueChanged(int)),this,SLOT(slot_ScroolWidget(int))); 13 //定義的指針 14 _svg_needle = new QSvgRenderer(this); 15 _svg_needle->load(QString::fromLocal8Bit(":/image/needle.svg")); 16 } 17 18 myLabel::~myLabel() 19 { 20 21 } 22 23 24 void myLabel::slot_ScroolWidget(int value) 25 { 26 valueSlider = value; 27 update(); 28 } 29 30 void myLabel::resizeEvent(QResizeEvent *event) 31 { 32 //滑動條的位置 33 _slider->setGeometry(250,440,301,41); 34 } 35 36 //重載的painter 37 void myLabel::paintEvent(QPaintEvent *event) 38 { 39 QPainter painter(this); 40 41 42 painter.setRenderHints(QPainter::Antialiasing); 43 44 painter.save(); 45 QTransform trans; 46 trans.translate(rect().width()/2.0+10, rect().height()-140); 47 trans.rotate(((valueSlider) * (180.0 / 200))); 48 trans.translate(-rect().width()/2.0, -rect().height()/2.0); 49 painter.setWorldTransform(trans); 50 // 51 //寬、高都需要計算 52 int h = 4.0 * rect().height()/210.0; 53 _svg_needle->render(&painter, QRectF(rect().left()/2.0+232, (rect().height() - h)/2.0, 168, 16)); 54 55 painter.restore(); 56 painter.end();}
第二種方法:
相對於第一種方法比較簡單,但是在有動畫效果的時候會達不到預期的效果。
1 QImage image(1000,1000,QImage::Format_ARGB32);//定義圖片,在圖片上畫 2 painter.begin(&image); 3 .......... 4 ......... 5 ........ //需要畫的內容 6 7 8 //畫在label上 9 ui->painterLabel->setPixmap(QPixmap::fromImage(image));
