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_WHATSTHIS
    q->setAttribute(Qt::WA_CustomWhatsThis);
#endif
    q->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 还有更多样式,可以查查相关文章

相关推荐

  1. QT使用QStyle实现QMenu滚动效果

    2024-01-13 05:00:01       55 阅读
  2. 使用Qt实现文本闪烁效果

    2024-01-13 05:00:01       62 阅读
  3. uni-app中实现弹幕滚动效果

    2024-01-13 05:00:01       58 阅读
  4. vue实现列表自动滚动效果

    2024-01-13 05:00:01       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-13 05:00:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-13 05:00:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-13 05:00:01       82 阅读
  4. Python语言-面向对象

    2024-01-13 05:00:01       91 阅读

热门阅读

  1. LeetCode240. Search a 2D Matrix II

    2024-01-13 05:00:01       57 阅读
  2. Linux中RPM和yum管理和查询软件包

    2024-01-13 05:00:01       44 阅读
  3. Vue如何创建一个新页面以及相关路由配置详解

    2024-01-13 05:00:01       52 阅读
  4. 网络编程之Socket

    2024-01-13 05:00:01       59 阅读
  5. linux脚本将JAR安装进systemctl

    2024-01-13 05:00:01       54 阅读
  6. 用spring Cach在Redis中缓存数据表

    2024-01-13 05:00:01       54 阅读
  7. docker容器内运行python多进程卡住

    2024-01-13 05:00:01       52 阅读
  8. 探索跨平台UI框架Maui

    2024-01-13 05:00:01       47 阅读
  9. uni-app使用uni-ui加ts类型限制

    2024-01-13 05:00:01       52 阅读