千家信息网

Qt如何实现导航按钮控件

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,这篇文章主要介绍了Qt如何实现导航按钮控件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言导航按钮控件,主要用于各种漂亮精美的导
千家信息网最后更新 2025年01月24日Qt如何实现导航按钮控件

这篇文章主要介绍了Qt如何实现导航按钮控件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

一、前言

导航按钮控件,主要用于各种漂亮精美的导航条,我们经常在web中看到导航条都非常精美,都是html+css+js实现的,还自带动画过度效果,Qt提供的qss其实也是无敌的,支持基本上所有的CSS2属性,配合QPainter这个无敌大法工具,没有什么不能绘制的。这个控件总结了大部分的导航条样式,比如左侧+右侧+顶部+底部,线条指示器,倒三角指示器等。还可以在导航条前面加上图标等,就显得更加有特色。有了此控件,再也不用担心没有精美的导航了。总之这个控件在我的很多的项目中都在用,而且很多Qt界的朋友也在用,反响很热烈很好。

主要功能:

  1. 可设置文字的左侧+右侧+顶部+底部间隔

  2. 可设置文字对齐方式

  3. 可设置显示倒三角/倒三角边长/倒三角位置/倒三角颜色

  4. 可设置显示图标/图标间隔/图标尺寸/正常状态图标/悬停状态图标/选中状态图标

  5. 可设置显示边框线条/线条宽度/线条间隔/线条位置/线条颜色

  6. 可设置正常背景颜色/悬停背景颜色/选中背景颜色

  7. 可设置正常文字颜色/悬停文字颜色/选中文字颜色

  8. 可设置背景颜色为画刷颜色

二、代码思路

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安全错误 数据库的锁怎样保障安全 中国软件开发人物排名 一个数据库可包含多少数据表 漳平专业软件开发公司推荐 文档数据库数据冗余 我的世界手机服务器跑酷 武汉oa软件开发团队 网络安全知识竞赛的形式 数据库技术详解 阿里云oracle数据库导出 idea项目的数据库文件在哪 服务器安全维护后数据库连不上 未成年网络安全教育事例 正规网络技术分类五星服务 网络安全形势要 悠嗨网络技术有限公司 企业网络安全治理 安卓软件用什么软件开发 数据库学习科目 数据库找出相同的数据库 数据库原理和计算机网络哪个有用 国产服务器上市概念股 计算机网络技术与安全考试题 正规网络技术分类五星服务 8g的内存够软件开发买 浙江特种网络技术服务创新服务 滁州网络安全管理系统 arcmap无法连接数据库 数据库原理和计算机网络哪个有用 电脑编程和电脑软件开发相同吗 怎么按照两列查询相同数据库
0