当前位置: 首页 > news >正文

QT:使用QStyle实现QMenu的滚动效果

项目中,使用QMenu,多个QAction时 超出页面范围,需要菜单栏可以上下滚动。

实际QMenu是带滚动的,但是要知道怎么使用 还是需要查看QT源码,现在简单记录下我的使用方法。

QT源码中:q->style()->styleHint(QStyle::SH_Menu_Scrollable, 0, q) 是支持滚动样式的,需要配置

void QMenuPrivate::init()
{QMenu * const q = q_func();Q_Q(QMenu);
#ifndef QT_NO_WHATSTHISq->setAttribute(Qt::WA_CustomWhatsThis);
#endifq->setAttribute(Qt::WA_X11NetWmWindowTypePopupMenu);defaultMenuAction = menuAction = new QAction(q);menuAction->d_func()->menu = q;QObject::connect(menuAction, &QAction::changed, [=] {if (!tornPopup.isNull())tornPopup->updateWindowTitle();});q->setMouseTracking(q->style()->styleHint(QStyle::SH_Menu_MouseTracking, 0, q));if (q->style()->styleHint(QStyle::SH_Menu_Scrollable, 0, q)) {scroll = new QMenuPrivate::QMenuScroller;scroll->scrollFlags = QMenuPrivate::QMenuScroller::ScrollNone;}sloppyState.initialize(q);delayState.initialize(q);mousePopupDelay = q->style()->styleHint(QStyle::SH_Menu_SubMenuPopupDelay, 0, q);
}

配置方法代码:

//跟进源码发现styleHint()是虚函数,需要自定义
#include <QtWidgets>
#include <QStyle>
class UProxyStyle:public QProxyStyle{     Q_OBJECT
int styleHint(StyleHint h, const QStyleOption *op = Q_NULLPTR,const QWidget *w = Q_NULLPTR, QStyleHintReturn *rd = Q_NULLPTR) const{printf("UMenu::styleHint  %d\n",h);switch(h){  //以下设置的效果见图13-12的讲解case QStyle::SH_ScrollBar_LeftClickAbsolutePosition: return true;case QStyle::SH_ScrollBar_MiddleClickAbsolutePosition:return true;case QStyle::SH_ScrollBar_ScrollWhenPointerLeavesControl: return false;	case QStyle::SH_Menu_Scrollable: return true;/*这一句是关键,返回true,表明支持*/ }return QProxyStyle::styleHint(h,op,w);	}
};//实际QMenu的使用QMenu* m_viewMenu   = new QMenu();int i = 0;for(i = 0; i < 20; i++){QAction* m_Action1     = new QAction(QStringLiteral("测试")+i, m_viewMenu);m_viewMenu->addAction(m_Action1);}// 启用滚动菜单的样式提示m_viewMenu->setStyle(new UProxyStyle());

实际使用不麻烦,可惜我最开始没看源码,盲人摸象 耽误了很多时间,还是源码最靠谱!

QStyle 还有更多样式,可以查查相关文章

http://www.lryc.cn/news/279006.html

相关文章:

  • 双指针问题——求只包含两个元素的最长连续子序列(子数组)
  • Unity组件开发--短连接HTTP
  • 真正的强大,原来是不动声色的
  • git 查看tag和创建tag以及上传tag命令
  • 代码随想录二刷 |二叉树 | 二叉搜索树的最小绝对差
  • 【Linux】Linux 系统编程——tree 命令
  • Android简单控件
  • 【Java 干货教程】Java实现分页的几种方式详解
  • 关于Python里xlwings库对Excel表格的操作(三十一)
  • QML使用QCustomPlot笔记
  • 【REST2SQL】06 GO 跨包接口重构代码
  • 《NLP入门到精通》栏目导读
  • C++学习笔记——类继承
  • ARCGIS PRO SDK 使用条件管理 Pro UI
  • Halcon经典的边缘检测算子Sobel/Laplace/Canny
  • 用单片机设计PLC电路图
  • 【设计模式-6】建造者模式的实现与框架中的应用
  • PositiveSSL和Sectigo的多域名证书
  • Docker:docker exec命令简介
  • 【大数据进阶第三阶段之Hive学习笔记】Hive的数据类型与数据操作
  • GPT2:Language Models are Unsupervised Multitask Learners
  • 微创新与稳定性的权衡
  • 对回调函数的各种讲解说明
  • Java多线程:创建多线程的三种方式
  • Unity中打印信息的两种方式
  • 给定n个字符串s[1...n], 求有多少个数对(i, j), 满足i < j 且 s[i] + s[j] == s[j] + s[i]?
  • Linux磁盘空间与文件大小查看命令详解
  • 网络通信过程的一些基础问题
  • STL——stack容器和queue容器详解
  • django websocket实现聊天室功能