今天的风儿真喧嚣呀!
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++那么麻烦也是一件好事。
学习就像爬山,没有爬不过去的山,只有不想爬的人。
欢迎大家一起来分享你的好的代码。
-----------------------------------------------------------------------------------------华丽的结束线---------------------------------------------------------------------------------