标签:控件 自定义 void RoundButton 圆形 radius event painter
Qt自定义控件之圆形按钮、圆形头像
前言
现在很多软件的头像或者按钮都是圆形了,看起来比较舒服。比如QQ登录头像,酷狗客户端的一些按钮都是圆形。Qt实现圆形头像,大致有几种思路,第1种就是图片遮罩的方式,还有一种方法是使用样式表设置border-radius来实现圆形边框。这里要介绍的是使用Qt的绘画大师QPainter来实现。
代码实现
#include "roundbutton.h"
#include "ui_roundbutton.h"
#include <QPainter>
#ifndef NO_TOUCH_EVENT
RoundButton::RoundButton(QWidget *parent) :
QWidget(parent),
ui(new Ui::RoundButton)
{
ui->setupUi(this);
m_radius = 200;
isPressed = false;
setIcon(":/ppd.jpeg");
#ifdef NO_TOUCH_EVENT
connect(this,&RoundButton::btnClicked,[=]
{
qDebug("Round button clicked.");
setIcon(":/timo.jpg");
});
#endif
}
RoundButton::~RoundButton()
{
delete ui;
}
void RoundButton::setIcon(const QString &fileName)
{
if(pixmap.load(fileName))
{
qDebug("load icon ok.");
update();
}
}
void RoundButton::setRadius(int radius)
{
m_radius = radius;
}
#ifdef NO_TOUCH_EVENT
void RoundButton::mousePressEvent(QMouseEvent *event)
{
Q_UNUSED(event)
isPressed = true;
}
void RoundButton::mouseMoveEvent(QMouseEvent *event)
{
Q_UNUSED(event)
}
void RoundButton::mouseReleaseEvent(QMouseEvent *event)
{
Q_UNUSED(event)
if(isPressed)
{
isPressed = false;
emit btnClicked();
}
}
#endif
void RoundButton::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
QPainter painter(this);
//抗锯齿
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
//绘画路径
QPainterPath path;
path.addEllipse(this->rect().center(),m_radius,m_radius);
painter.setClipPath(path);
//绘图
painter.drawPixmap(QRect(0,0,m_radius*2,m_radius*2),pixmap);
}
QPainterPath是一个图形构建块的对象,如矩形、椭圆、直线和曲线。构建块可以加入在封闭的子路径中,例如:矩形或椭圆形。一个封闭的路径同时存在开始点和结束点。或者作为未封闭的子路径独立存在,如:直线和曲线。
addEllipse在指定的边框矩形内创建椭圆,并将其作为闭合子路径添加到绘制路径。
椭圆由一条顺时针的曲线组成,在零度(3点钟位置)开始和结束。
最后通过drawPixmap把图片画出来。本示例中打开 NO_TOUCH_EVENT 宏可作为圆形按钮使用,关闭就仅作为圆形头像使用。
当然了还可以使用painter的drawRoundedRect来实现圆形的绘画。这个有兴趣的可以自行研究。
实验效果
本示例代码稍作修改即可运用到工程中,灵活性也比较高。
作者:费码程序猿
欢迎技术交流:QQ:255895056
转载请注明出处,如有不当欢迎指正
标签:控件,自定义,void,RoundButton,圆形,radius,event,painter 来源: https://blog.csdn.net/haohaohaihuai/article/details/106502572
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。