Qt 高级UI篇重写自己想要的控件以QLabel为列实现旋转,放大,缩小

今天的风儿真喧嚣呀!

1234

我们开始吧

------------------------------------------------------------------华丽的开始线--------------------------------------------------------------

用过QT的都知道QT的控件真的不好看,那么你可能需要自己重写了,不用担心重写还是很麻烦的。

首先请看图:

还是很好看的:::::

首先博主继承的是QLabel

下面是代码的头文件h:

 1 #pragma once
 2 #include <QLabel> 
 3 #include <QMouseEvent>
 4 #include <QPropertyAnimation>
 5 #include "Tool.h"
 6 #include "qdebug.h"
 7 #include <QTimer>
 8 #include <QTimerEvent>
 9 class LogoLabel :public QLabel
10 {
11     Q_OBJECT
12 public:
13     explicit LogoLabel(QWidget *parent = 0);
14     LogoLabel(const QString &text, QWidget *parent = 0);
15     void setQPixmapPath(QString path);
16     void setImageSize(int imageWidth, int imageHeight);
17 signals:
18     // 鼠标单击信号  
19     void clicked();  
20 protected:
21     // 鼠标单击事件  
22     void mouseReleaseEvent(QMouseEvent *);
23     void enterEvent(QEvent *);
24     void leaveEvent(QEvent *);
25     //定时器
26     void timerEvent(QTimerEvent *event); 
27 private:
28     //图片缓存(使用缓存技术免得重复打开图片造成浪费)
29     QPixmap logoPix;
30     //是否在旋转
31     bool isRotate = true;
32     bool isMagnify = true;
33     //存储图片的大小
34     int imageWidth = 0;
35     int imageHeight = 0;
36     //图片的地址
37     QString pixmapPath; 
38     //旋转定时器
39     int rotateTimerId;
40     //旋转度数
41     int rotateNumber = 0;
42     public slots:
43 public :
44     //按钮是否放大
45     void setMagnify(bool isMagnify){
46         this->isMagnify = isMagnify;
47     }
48     //按钮是否旋转
49     void setRotate(bool isRotate){
50         this->isRotate = isRotate;
51     }
52     //按钮旋转
53     void setImageTransparency(int transNumber);
54 };

注释已经很详细了:还有不明白的可以在下面留言。

那么我们再来看看cpp主体文件:

 1 #include "LogoLabel.h" 
 2 LogoLabel::LogoLabel(QWidget *parent) :
 3 QLabel(parent)
 4 { 
 5 }
 6  
 7 LogoLabel::LogoLabel(const QString &text, QWidget *parent) :
 8 QLabel(parent)
 9 {
10     setText(text);
11 }
12  
13 //鼠标释放事件
14 void LogoLabel::mouseReleaseEvent(QMouseEvent *ev)
15 {
16     if (ev->button() == Qt::LeftButton)
17         emit clicked();//(this);  
18 }
19 //鼠标进入事件
20 void LogoLabel::enterEvent(QEvent *)
21 { 
22     this->setWindowOpacity(1); 
23     QPixmap tempLogoPix = logoPix.scaled(imageWidth, imageHeight);
24     //如果可以旋转就启动定时器
25     if (isRotate){
26         rotateTimerId = startTimer(50);
27     } 
28     //如果放大就设置图片发达1.5倍
29     if (isMagnify){
30         setImageSize(this->imageWidth*1.5, this->imageHeight*1.5);
31     }
32 }
33 //设置图片大小事件
34 void LogoLabel::setImageSize(int imageWidth, int imageHeight){
35     this->imageWidth = imageWidth;
36     this->imageHeight = imageHeight;
37 }
38 //设置图片路劲
39 void LogoLabel::setQPixmapPath(QString path){
40     pixmapPath = path;
41     logoPix = QPixmap(path);
42     QPixmap tempLogoPix = logoPix.scaled(imageWidth, imageHeight);
43     Tool::setPixMapTransparency(tempLogoPix);
44     this->setPixmap(tempLogoPix);
45 }
46 //设置图片透明度
47 void LogoLabel::setImageTransparency(int transNumber){ 
48     QPixmap tempLogoPix = logoPix.scaled(imageWidth, imageHeight);
49     Tool::setPixMapTransparency(tempLogoPix, transNumber); 
50     this->setPixmap(tempLogoPix);
51 }
52 //定时器
53 void LogoLabel::timerEvent(QTimerEvent *event){
54     if (event->timerId() == rotateTimerId)
55     {
56         if (isRotate){
57             //默认一次旋转3个角度
58             rotateNumber += 3; 
59             QPixmap tempLogoPix = logoPix.scaled(imageWidth, imageHeight);
60             Tool::setPixMapRotate(tempLogoPix, rotateNumber);
61             this->setPixmap(tempLogoPix);
62         }
63         else{
64             killTimer(rotateTimerId);
65             rotateTimerId = 0;
66         } 
67     }
68     else{
69         QWidget::timerEvent(event);
70     }
71 }
72 //鼠标离开事件
73 void LogoLabel::leaveEvent(QEvent *)
74 {
75     if (isRotate && (rotateTimerId != 0)){
76         killTimer(rotateTimerId);
77     }
78     if (isMagnify){
79         setImageSize(this->imageWidth / 1.5, this->imageHeight / 1.5);
80     } 
81     QPixmap tempLogoPix = logoPix.scaled(imageWidth, imageHeight);
82     Tool::setPixMapTransparency(tempLogoPix);
83     this->setPixmap(tempLogoPix);
84     rotateNumber = 0; 
85 }

还有一个Tool工具类配合使用那么上代码吧:

 1 #pragma once
 2 #include <QObject>
 3 #include <QPainter>
 4 #include <QPixmap>
 5 #include <qsize.h>
 6 class Tool :public QObject
 7 {
 8     Q_OBJECT
 9 public:
10     Tool();
11     ~Tool();
12     static void setPixMapTransparency(  QPixmap &pix, int transparencyNumber=100);
13     static void setPixMapRotate(QPixmap &pix, int rotateNumber = 0);
14 };

定义为静态的主要是因为方便调用..................

工具类的Cpp文件:

 1 nclude "Tool.h" 
 2 Tool::Tool()
 3 {
 4 }
 5 //设置图片旋转度数
 6 void Tool::setPixMapRotate(QPixmap &pix, int rotateNumber ){
 7     int imageWidth = pix.width();
 8     int imageHeight = pix .height();
 9  
10     QPixmap temp(pix.size());
11     temp.fill(Qt::transparent);
12     QPainter  painter(&temp); 
13     painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
14     painter.translate(imageWidth / 2, imageHeight / 2); //让图片的中心作为旋转的中心
15     painter.rotate(rotateNumber); //顺时针旋转90度
16     painter.translate(-(imageWidth / 2), -(imageHeight / 2)); //使原点复原
17     painter.drawPixmap(0, 0,   pix);
18     painter.end();
19     pix = temp;
20 }
21 //设置图片透明度
22 void Tool::setPixMapTransparency(  QPixmap &pix,int transparencyNumber){
23     QPixmap temp(pix.size());
24     temp.fill(Qt::transparent); 
25     QPainter  imagePain(&temp);
26     imagePain.setCompositionMode(QPainter::CompositionMode_Source);
27     imagePain.drawPixmap(0, 0, pix);
28     imagePain.setCompositionMode(QPainter::CompositionMode_DestinationIn);
29     imagePain.fillRect(temp.rect(), QColor(0, 0, 0, transparencyNumber));
30     imagePain.end();
31     pix = temp;
32 }
33  
34 Tool::~Tool()
35 {
36 }

一切都是这么麻烦,当然既然是C++那么麻烦也是一件好事。

学习就像爬山,没有爬不过去的山,只有不想爬的人。

欢迎大家一起来分享你的好的代码。

-----------------------------------------------------------------------------------------华丽的结束线---------------------------------------------------------------------------------

 

原文地址:https://www.cnblogs.com/ybqjymy/p/13900977.html