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 
#include 
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 还有更多样式,可以查查相关文章

你可能感兴趣的:(qt,数据库,开发语言)