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

4 篇文章 0 订阅
3 篇文章 0 订阅

用过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++那么麻烦也是一件好事。

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

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

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一路随云00000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值