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

发布时间:2024年01月11日

项目中,使用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 还有更多样式,可以查查相关文章

文章来源:https://blog.csdn.net/sinat_27265739/article/details/135521504
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。