• 82964阅读
  • 243回复

Qt编写导航按钮 [复制链接]

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 正序阅读 楼主  发表于: 2017-12-24
做各种各样的界面的时候,经常需要做一排按钮用于切换到对应界面,俗称导航按钮或者导航菜单,参照过各种各样的主界面导航布局,特意编写导航按钮自定义控件,结合各种情况,继承自QPushButton。已集成在QUC自定义控件中。
作品已在另外一篇帖子开源,请见http://www.qtcn.org/bbs/read-htm-tid-66098.html
  1. /**
  2. * 导航按钮控件 作者:feiyangqingyun(QQ:517216493) 2017-12-19
  3. * 1:可设置文字的左侧+右侧+顶部+底部间隔
  4. * 2:可设置文字对齐方式
  5. * 3:可设置显示倒三角/倒三角边长/倒三角位置/倒三角颜色
  6. * 4:可设置显示图标/图标间隔/图标尺寸/正常状态图标/悬停状态图标/选中状态图标
  7. * 5:可设置显示边框线条/线条宽度/线条间隔/线条位置/线条颜色
  8. * 6:可设置正常背景颜色/悬停背景颜色/选中背景颜色
  9. * 7:可设置正常文字颜色/悬停文字颜色/选中文字颜色
  10. * 8:可设置背景颜色为画刷颜色
  11. */






本人有代码洁癖症,写代码处处讲究对称完美。如下图所示。


主要代码:
  1. void NavButton::paintEvent(QPaintEvent *)
  2. {
  3.     //绘制准备工作,启用反锯齿
  4.     QPainter painter(this);
  5.     painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
  6.     //绘制背景
  7.     drawBg(&painter);
  8.     //绘制文字
  9.     drawText(&painter);
  10.     //绘制图标
  11.     drawIcon(&painter);
  12.     //绘制边框线条
  13.     drawLine(&painter);
  14.     //绘制右侧倒三角
  15.     drawTriangle(&painter);
  16. }
  17. void NavButton::drawBg(QPainter *painter)
  18. {
  19.     painter->save();
  20.     painter->setPen(Qt::NoPen);
  21.     int width = this->width();
  22.     int height = this->height();
  23.     QRect bgRect;
  24.     if (linePosition == LinePosition_Left) {
  25.         bgRect = QRect(lineSpace, 0, width - lineSpace, height);
  26.     } else if (linePosition == LinePosition_Right) {
  27.         bgRect = QRect(0, 0, width - lineSpace, height);
  28.     } else if (linePosition == LinePosition_Top) {
  29.         bgRect = QRect(0, lineSpace, width, height - lineSpace);
  30.     } else if (linePosition == LinePosition_Bottom) {
  31.         bgRect = QRect(0, 0, width, height - lineSpace);
  32.     }
  33.     //如果画刷存在则取画刷
  34.     QBrush bgBrush;
  35.     if (isChecked()) {
  36.         bgBrush = checkBgBrush;
  37.     } else if (hover) {
  38.         bgBrush = hoverBgBrush;
  39.     } else {
  40.         bgBrush = normalBgBrush;
  41.     }
  42.     if (bgBrush != Qt::NoBrush) {
  43.         painter->setBrush(bgBrush);
  44.     } else {
  45.         //根据当前状态选择对应颜色
  46.         QColor bgColor;
  47.         if (isChecked()) {
  48.             bgColor = checkBgColor;
  49.         } else if (hover) {
  50.             bgColor = hoverBgColor;
  51.         } else {
  52.             bgColor = normalBgColor;
  53.         }
  54.         painter->setBrush(bgColor);
  55.     }
  56.     painter->drawRect(bgRect);
  57.     painter->restore();
  58. }
  59. void NavButton::drawText(QPainter *painter)
  60. {
  61.     painter->save();
  62.     painter->setBrush(Qt::NoBrush);
  63.     //根据当前状态选择对应颜色
  64.     QColor textColor;
  65.     if (isChecked()) {
  66.         textColor = checkTextColor;
  67.     } else if (hover) {
  68.         textColor = hoverTextColor;
  69.     } else {
  70.         textColor = normalTextColor;
  71.     }
  72.     QRect textRect = QRect(paddingLeft, paddingTop, width() - paddingLeft - paddingRight, height() - paddingTop - paddingBottom);
  73.     painter->setPen(textColor);
  74.     painter->drawText(textRect, textAlign | Qt::AlignVCenter, text());
  75.     painter->restore();
  76. }
  77. void NavButton::drawIcon(QPainter *painter)
  78. {
  79.     if (!showIcon) {
  80.         return;
  81.     }
  82.     painter->save();
  83.     QPixmap pix;
  84.     if (isChecked()) {
  85.         pix = iconCheck;
  86.     } else if (hover) {
  87.         pix = iconHover;
  88.     } else {
  89.         pix = iconNormal;
  90.     }
  91.     if (!pix.isNull()) {
  92.         //等比例平滑缩放图标
  93.         pix = pix.scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
  94.         painter->drawPixmap(iconSpace, (height() - iconSize.height()) / 2, pix);
  95.     }
  96.     painter->restore();
  97. }
  98. void NavButton::drawLine(QPainter *painter)
  99. {
  100.     if (!showLine) {
  101.         return;
  102.     }
  103.     if (!isChecked()) {
  104.         return;
  105.     }
  106.     painter->save();
  107.     QPen pen;
  108.     pen.setWidth(lineWidth);
  109.     pen.setColor(lineColor);
  110.     painter->setPen(pen);
  111.     //根据线条位置设置线条坐标
  112.     QPoint pointStart, pointEnd;
  113.     if (linePosition == LinePosition_Left) {
  114.         pointStart = QPoint(0, 0);
  115.         pointEnd = QPoint(0, height());
  116.     } else if (linePosition == LinePosition_Right) {
  117.         pointStart = QPoint(width(), 0);
  118.         pointEnd = QPoint(width(), height());
  119.     } else if (linePosition == LinePosition_Top) {
  120.         pointStart = QPoint(0, 0);
  121.         pointEnd = QPoint(width(), 0);
  122.     } else if (linePosition == LinePosition_Bottom) {
  123.         pointStart = QPoint(0, height());
  124.         pointEnd = QPoint(width(), height());
  125.     }
  126.     painter->drawLine(pointStart, pointEnd);
  127.     painter->restore();
  128. }
  129. void NavButton::drawTriangle(QPainter *painter)
  130. {
  131.     if (!showTriangle) {
  132.         return;
  133.     }
  134.     //选中或者悬停显示
  135.     if (!hover && !isChecked()) {
  136.         return;
  137.     }
  138.     painter->save();
  139.     painter->setPen(Qt::NoPen);
  140.     painter->setBrush(triangleColor);
  141.     //绘制在右侧中间,根据设定的倒三角的边长设定三个点位置
  142.     int width = this->width();
  143.     int height = this->height();
  144.     int midWidth = width / 2;
  145.     int midHeight = height / 2;
  146.     QPolygon pts;
  147.     if (trianglePosition == TrianglePosition_Left) {
  148.         pts.setPoints(3, triangleLen, midHeight, 0, midHeight - triangleLen, 0, midHeight + triangleLen);
  149.     } else if (trianglePosition == TrianglePosition_Right) {
  150.         pts.setPoints(3, width - triangleLen, midHeight, width, midHeight - triangleLen, width, midHeight + triangleLen);
  151.     } else if (trianglePosition == TrianglePosition_Top) {
  152.         pts.setPoints(3, midWidth, triangleLen, midWidth - triangleLen, 0, midWidth + triangleLen, 0);
  153.     } else if (trianglePosition == TrianglePosition_Bottom) {
  154.         pts.setPoints(3, midWidth, height - triangleLen, midWidth - triangleLen, height, midWidth + triangleLen, height);
  155.     }
  156.     painter->drawPolygon(pts);
  157.     painter->restore();
  158. }



184条评分好评度+49贡献值+39金钱+265威望+38
nexito 好评度 +1 - 2020-12-25
nexito 贡献值 +1 - 2020-12-25
nexito 威望 +1 - 2020-12-25
nexito 金钱 +10 - 2020-12-25
jiangzx 金钱 +1 - 2020-12-25
18367160642 好评度 +1 优秀文章,支持!n神马都是浮云 2019-03-07
18367160642 贡献值 +1 优秀文章,支持!n神马都是浮云 2019-03-07
18367160642 威望 +1 优秀文章,支持!n神马都是浮云 2019-03-07
18367160642 金钱 +3 优秀文章,支持!n神马都是浮云 2019-03-07
unitcode 金钱 +1 优秀文章,支持!n神马都是浮云 2018-11-22
123456...19下一页
到第
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线jazzmax

只看该作者 243楼 发表于: 2023-01-04
厉害,新手路过,学习中,谢谢。   qinhuangtaotao@126.com
  
离线jiangzx

只看该作者 242楼 发表于: 2020-12-25
感谢刘大师17801095084@163.com
离线azulgrana

只看该作者 241楼 发表于: 2020-04-28
感谢分享,好评~~
455972173@qq.com
离线qpj_qpj

只看该作者 240楼 发表于: 2020-01-09
感谢分享,向你学习,lutqpj@163 .com,谢谢!
离线xiaolele

只看该作者 239楼 发表于: 2019-08-26
大师,绝对的大师,感谢分享
离线wfdsf

只看该作者 238楼 发表于: 2019-03-20
感谢分享,yangfenzhia@163.com,谢谢!
离线18367160642

只看该作者 237楼 发表于: 2019-03-07
刘大师源码还在吗?分析一个,谢谢862458517@qq.com
离线syc1993

只看该作者 236楼 发表于: 2019-03-05
希望没有来晚,刘大神,感谢分享  934298001@qq.com
离线sunzhguy

只看该作者 235楼 发表于: 2019-02-22
感谢原创分享,初学者福利,谢谢,努力学习,sunzhg20@qq.com
离线wdram123

只看该作者 234楼 发表于: 2018-09-19
谢谢分享  wuyanjun110@126.com
离线白马

只看该作者 233楼 发表于: 2018-09-07
       刘大师依旧给力 956220181@qq.com
离线yayi

只看该作者 232楼 发表于: 2018-09-05
强烈支持!求源码:113572101@qq.com
谢谢大师
离线阿哲mmi

只看该作者 231楼 发表于: 2018-08-24
好东西,学习了,果断好评!同求源码:myhouse365@163.com
离线阿哲mmi

只看该作者 230楼 发表于: 2018-08-24
支持!求源码:myhouse365@163.com
离线令狐少侠

只看该作者 229楼 发表于: 2018-08-21
刘大师,作品很赞,非常值得学习! 348940862@qq.com
离线jiangbaijun

只看该作者 228楼 发表于: 2018-08-20
感谢分享,学习 453436534@qq.com
离线hireboy

只看该作者 227楼 发表于: 2018-08-17
离线qhp666

只看该作者 226楼 发表于: 2018-08-07
感谢分享,向你学习。 qhp_vision@163.com
离线cqu_keith

只看该作者 225楼 发表于: 2018-08-04
离线dansir

只看该作者 224楼 发表于: 2018-07-19
求大神代码 690865063@qq.com
离线起点0615

只看该作者 223楼 发表于: 2018-06-28
支持刘大师,很喜欢刘大师作品。
88231398@qq.com
离线qq860930595

只看该作者 222楼 发表于: 2018-06-28
大师开源精神值得学习,860930595@qq.com
离线lin_xiongg

只看该作者 221楼 发表于: 2018-06-28
多谢大师出手, lin_xiongg@sina.com
离线byfhss

只看该作者 220楼 发表于: 2018-06-26
谢谢分享,学习 634632257@qq.com
离线chych

只看该作者 219楼 发表于: 2018-06-25
谢谢分享,学习一下chychlucky@126.com
离线zhangdavide

只看该作者 218楼 发表于: 2018-06-25
在模仿你的路上越走越远,希望以后能走的更远534830256@qq.com,谢谢
离线gaoheyang

只看该作者 217楼 发表于: 2018-06-22
好东西,楼主能给我一份吗gq_ttxshang@163.com

只看该作者 216楼 发表于: 2018-06-20
420803298@qq.com 大师大师大师
离线chrisv

只看该作者 215楼 发表于: 2018-06-14
     多谢刘大师
离线liguojin8509

只看该作者 214楼 发表于: 2018-06-04
非常感谢开源,感谢分享。膜拜ing,,,,,274994490@qq.com
离线chongyong

只看该作者 213楼 发表于: 2018-06-04
膜拜大佬,露珠好人。求源码一份 474724048@qq.com
离线陈嘟嘟

只看该作者 212楼 发表于: 2018-06-01
大师出品,必须精品,感谢分享,向你学习,dong_fangzhishen@126.com,  
thanks
离线liudianwu

只看该作者 211楼 发表于: 2018-06-01
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线supersk

只看该作者 210楼 发表于: 2018-05-29
源码才是王道.38084302@qq.com
离线随心所遇

只看该作者 209楼 发表于: 2018-05-29
刘老师求代码,759021325@qq.com
我思顾我在

只看该作者 208楼 发表于: 2018-05-29
大神求代码 610412567@qq.com,感谢分享
离线zebulon

只看该作者 207楼 发表于: 2018-05-29
学习学习,1031554472@qq.com,谢谢
离线xdh873939316

只看该作者 206楼 发表于: 2018-05-29
请大神发一份学习下:873939316@qq.com
离线beijing2bash

只看该作者 205楼 发表于: 2018-05-29
优秀文章,支持!请给份源码beijing2bashi@163.com
快速回复
限100 字节
 
上一个 下一个