Qt如何实现导航按钮控件
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍了Qt如何实现导航按钮控件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言导航按钮控件,主要用于各种漂亮精美的导
千家信息网最后更新 2026年10月31日Qt如何实现导航按钮控件
这篇文章主要介绍了Qt如何实现导航按钮控件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
一、前言
导航按钮控件,主要用于各种漂亮精美的导航条,我们经常在web中看到导航条都非常精美,都是html+css+js实现的,还自带动画过度效果,Qt提供的qss其实也是无敌的,支持基本上所有的CSS2属性,配合QPainter这个无敌大法工具,没有什么不能绘制的。这个控件总结了大部分的导航条样式,比如左侧+右侧+顶部+底部,线条指示器,倒三角指示器等。还可以在导航条前面加上图标等,就显得更加有特色。有了此控件,再也不用担心没有精美的导航了。总之这个控件在我的很多的项目中都在用,而且很多Qt界的朋友也在用,反响很热烈很好。
主要功能:
可设置文字的左侧+右侧+顶部+底部间隔
可设置文字对齐方式
可设置显示倒三角/倒三角边长/倒三角位置/倒三角颜色
可设置显示图标/图标间隔/图标尺寸/正常状态图标/悬停状态图标/选中状态图标
可设置显示边框线条/线条宽度/线条间隔/线条位置/线条颜色
可设置正常背景颜色/悬停背景颜色/选中背景颜色
可设置正常文字颜色/悬停文字颜色/选中文字颜色
可设置背景颜色为画刷颜色
二、代码思路
void NavButton::paintEvent(QPaintEvent *){ //绘制准备工作,启用反锯齿 QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); //绘制背景 drawBg(&painter); //绘制文字 drawText(&painter); //绘制图标 drawIcon(&painter); //绘制边框线条 drawLine(&painter); //绘制倒三角 drawTriangle(&painter);}void NavButton::drawBg(QPainter *painter){ painter->save(); painter->setPen(Qt::NoPen); int width = this->width(); int height = this->height(); QRect bgRect; if (linePosition == LinePosition_Left) { bgRect = QRect(lineSpace, 0, width - lineSpace, height); } else if (linePosition == LinePosition_Right) { bgRect = QRect(0, 0, width - lineSpace, height); } else if (linePosition == LinePosition_Top) { bgRect = QRect(0, lineSpace, width, height - lineSpace); } else if (linePosition == LinePosition_Bottom) { bgRect = QRect(0, 0, width, height - lineSpace); } //如果画刷存在则取画刷 QBrush bgBrush; if (isChecked()) { bgBrush = checkBgBrush; } else if (hover) { bgBrush = hoverBgBrush; } else { bgBrush = normalBgBrush; } if (bgBrush != Qt::NoBrush) { painter->setBrush(bgBrush); } else { //根据当前状态选择对应颜色 QColor bgColor; if (isChecked()) { bgColor = checkBgColor; } else if (hover) { bgColor = hoverBgColor; } else { bgColor = normalBgColor; } painter->setBrush(bgColor); } painter->drawRect(bgRect); painter->restore();}void NavButton::drawText(QPainter *painter){ painter->save(); painter->setBrush(Qt::NoBrush); //根据当前状态选择对应颜色 QColor textColor; if (isChecked()) { textColor = checkTextColor; } else if (hover) { textColor = hoverTextColor; } else { textColor = normalTextColor; } QRect textRect = QRect(paddingLeft, paddingTop, width() - paddingLeft - paddingRight, height() - paddingTop - paddingBottom); painter->setPen(textColor); painter->drawText(textRect, textAlign | Qt::AlignVCenter, text()); painter->restore();}void NavButton::drawIcon(QPainter *painter){ if (!showIcon) { return; } painter->save(); QPixmap pix; if (isChecked()) { pix = iconCheck; } else if (hover) { pix = iconHover; } else { pix = iconNormal; } if (!pix.isNull()) { //等比例平滑缩放图标 pix = pix.scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); painter->drawPixmap(iconSpace, (height() - iconSize.height()) / 2, pix); } painter->restore();}void NavButton::drawLine(QPainter *painter){ if (!showLine) { return; } if (!isChecked()) { return; } painter->save(); QPen pen; pen.setWidth(lineWidth); pen.setColor(lineColor); painter->setPen(pen); //根据线条位置设置线条坐标 QPoint pointStart, pointEnd; if (linePosition == LinePosition_Left) { pointStart = QPoint(0, 0); pointEnd = QPoint(0, height()); } else if (linePosition == LinePosition_Right) { pointStart = QPoint(width(), 0); pointEnd = QPoint(width(), height()); } else if (linePosition == LinePosition_Top) { pointStart = QPoint(0, 0); pointEnd = QPoint(width(), 0); } else if (linePosition == LinePosition_Bottom) { pointStart = QPoint(0, height()); pointEnd = QPoint(width(), height()); } painter->drawLine(pointStart, pointEnd); painter->restore();}void NavButton::drawTriangle(QPainter *painter){ if (!showTriangle) { return; } //选中或者悬停显示 if (!hover && !isChecked()) { return; } painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(triangleColor); //绘制在右侧中间,根据设定的倒三角的边长设定三个点位置 int width = this->width(); int height = this->height(); int midWidth = width / 2; int midHeight = height / 2; QPolygon pts; if (trianglePosition == TrianglePosition_Left) { pts.setPoints(3, triangleLen, midHeight, 0, midHeight - triangleLen, 0, midHeight + triangleLen); } else if (trianglePosition == TrianglePosition_Right) { pts.setPoints(3, width - triangleLen, midHeight, width, midHeight - triangleLen, width, midHeight + triangleLen); } else if (trianglePosition == TrianglePosition_Top) { pts.setPoints(3, midWidth, triangleLen, midWidth - triangleLen, 0, midWidth + triangleLen, 0); } else if (trianglePosition == TrianglePosition_Bottom) { pts.setPoints(3, midWidth, height - triangleLen, midWidth - triangleLen, height, midWidth + triangleLen, height); } painter->drawPolygon(pts); painter->restore();}三、效果图
感谢你能够认真阅读完这篇文章,希望小编分享的"Qt如何实现导航按钮控件"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
颜色
图标
线条
导航
可设
倒三角
控件
文字
状态
背景
篇文章
按钮
精美
位置
右侧
底部
指示
指示器
效果
朋友
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
云之行互联网科技
科技企业和互联网企业
朗新科技与工业互联网
互联网 科技公司
深圳互联网络科技有限公司
上海挚品互联网科技
互联网科技论文
崇明区互联网教育科技售后服务
迪庆互联网科技招生
山东大美朱楼互联网科技有限公司
中国科技和美国互联网
易租星互联网科技有限公司
同城互联网络科技
互联网科技职业技能培训学校
美国五大互联网科技公司市值多少
安徽零酒互联网科技有限公司
众联互联网络科技
杭州科技互联网公司有哪些
上海互联网科技园景观
重庆科技产业互联网有哪些
什么是科技互联网
互联网电商科技
互联网下的科技发展
广州善班互联网科技
湖北码尼互联网科技有限公司电话
成都互联网科技公司工作好不好
华夏恒生互联网科技013171
小米互联网科技园入驻
深圳无忧互联网科技
黑云互联网科技有限公司