用过QT的都知道QT的控件真的不好看,那么你可能需要自己重写了,不用担心重写还是很麻烦的。
首先请看图:
还是很好看的:::::
首先博主继承的是QLabel
下面是代码的头文件h:
#pragma once
#include <QLabel>
#include <QMouseEvent>
#include <QPropertyAnimation>
#include "Tool.h"
#include "qdebug.h"
#include <QTimer>
#include <QTimerEvent>
class LogoLabel :public QLabel
{
Q_OBJECT
public:
explicit LogoLabel(QWidget *parent = 0);
LogoLabel(const QString &text, QWidget *parent = 0);
void setQPixmapPath(QString path);
void setImageSize(int imageWidth, int imageHeight);
signals:
// 鼠标单击信号
void clicked();
protected:
// 鼠标单击事件
void mouseReleaseEvent(QMouseEvent *);
void enterEvent(QEvent *);
void leaveEvent(QEvent *);
//定时器
void timerEvent(QTimerEvent *event);
private:
//图片缓存(使用缓存技术免得重复打开图片造成浪费)
QPixmap logoPix;
//是否在旋转
bool isRotate = true;
bool isMagnify = true;
//存储图片的大小
int imageWidth = 0;
int imageHeight = 0;
//图片的地址
QString pixmapPath;
//旋转定时器
int rotateTimerId;
//旋转度数
int rotateNumber = 0;
public slots:
public :
//按钮是否放大
void setMagnify(bool isMagnify){
this->isMagnify = isMagnify;
}
//按钮是否旋转
void setRotate(bool isRotate){
this->isRotate = isRotate;
}
//按钮旋转
void setImageTransparency(int transNumber);
};
注释已经很详细了:还有不明白的可以在下面留言。
那么我们再来看看cpp主体文件:
#include "LogoLabel.h"
LogoLabel::LogoLabel(QWidget *parent) :
QLabel(parent)
{
}
LogoLabel::LogoLabel(const QString &text, QWidget *parent) :
QLabel(parent)
{
setText(text);
}
//鼠标释放事件
void LogoLabel::mouseReleaseEvent(QMouseEvent *ev)
{
if (ev->button() == Qt::LeftButton)
emit clicked();//(this);
}
//鼠标进入事件
void LogoLabel::enterEvent(QEvent *)
{
this->setWindowOpacity(1);
QPixmap tempLogoPix = logoPix.scaled(imageWidth, imageHeight);
//如果可以旋转就启动定时器
if (isRotate){
rotateTimerId = startTimer(50);
}
//如果放大就设置图片发达1.5倍
if (isMagnify){
setImageSize(this->imageWidth*1.5, this->imageHeight*1.5);
}
}
//设置图片大小事件
void LogoLabel::setImageSize(int imageWidth, int imageHeight){
this->imageWidth = imageWidth;
this->imageHeight = imageHeight;
}
//设置图片路劲
void LogoLabel::setQPixmapPath(QString path){
pixmapPath = path;
logoPix = QPixmap(path);
QPixmap tempLogoPix = logoPix.scaled(imageWidth, imageHeight);
Tool::setPixMapTransparency(tempLogoPix);
this->setPixmap(tempLogoPix);
}
//设置图片透明度
void LogoLabel::setImageTransparency(int transNumber){
QPixmap tempLogoPix = logoPix.scaled(imageWidth, imageHeight);
Tool::setPixMapTransparency(tempLogoPix, transNumber);
this->setPixmap(tempLogoPix);
}
//定时器
void LogoLabel::timerEvent(QTimerEvent *event){
if (event->timerId() == rotateTimerId)
{
if (isRotate){
//默认一次旋转3个角度
rotateNumber += 3;
QPixmap tempLogoPix = logoPix.scaled(imageWidth, imageHeight);
Tool::setPixMapRotate(tempLogoPix, rotateNumber);
this->setPixmap(tempLogoPix);
}
else{
killTimer(rotateTimerId);
rotateTimerId = 0;
}
}
else{
QWidget::timerEvent(event);
}
}
//鼠标离开事件
void LogoLabel::leaveEvent(QEvent *)
{
if (isRotate && (rotateTimerId != 0)){
killTimer(rotateTimerId);
}
if (isMagnify){
setImageSize(this->imageWidth / 1.5, this->imageHeight / 1.5);
}
QPixmap tempLogoPix = logoPix.scaled(imageWidth, imageHeight);
Tool::setPixMapTransparency(tempLogoPix);
this->setPixmap(tempLogoPix);
rotateNumber = 0;
}
还有一个Tool工具类配合使用那么上代码吧:
#pragma once
#include <QObject>
#include <QPainter>
#include <QPixmap>
#include <qsize.h>
class Tool :public QObject
{
Q_OBJECT
public:
Tool();
~Tool();
static void setPixMapTransparency( QPixmap &pix, int transparencyNumber=100);
static void setPixMapRotate(QPixmap &pix, int rotateNumber = 0);
};
定义为静态的主要是因为方便调用..................
工具类的Cpp文件:
nclude "Tool.h"
Tool::Tool()
{
}
//设置图片旋转度数
void Tool::setPixMapRotate(QPixmap &pix, int rotateNumber ){
int imageWidth = pix.width();
int imageHeight = pix .height();
QPixmap temp(pix.size());
temp.fill(Qt::transparent);
QPainter painter(&temp);
painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
painter.translate(imageWidth / 2, imageHeight / 2); //让图片的中心作为旋转的中心
painter.rotate(rotateNumber); //顺时针旋转90度
painter.translate(-(imageWidth / 2), -(imageHeight / 2)); //使原点复原
painter.drawPixmap(0, 0, pix);
painter.end();
pix = temp;
}
//设置图片透明度
void Tool::setPixMapTransparency( QPixmap &pix,int transparencyNumber){
QPixmap temp(pix.size());
temp.fill(Qt::transparent);
QPainter imagePain(&temp);
imagePain.setCompositionMode(QPainter::CompositionMode_Source);
imagePain.drawPixmap(0, 0, pix);
imagePain.setCompositionMode(QPainter::CompositionMode_DestinationIn);
imagePain.fillRect(temp.rect(), QColor(0, 0, 0, transparencyNumber));
imagePain.end();
pix = temp;
}
Tool::~Tool()
{
}
一切都是这么麻烦,当然既然是C++那么麻烦也是一件好事。
学习就像爬山,没有爬不过去的山,只有不想爬的人。
欢迎大家一起来分享你的好的代码。