QMenu增加带滚动条的子菜单

起因:QMenu原生没有自带滚动条,之前是想用重绘一个悬浮框,里面用带滚动条的自定义控件达到目的,

            后面通过取巧的方式。插入一个带QListWidge的QAction达到目的。

############################################################

调用

   ListWidgetAction* mpActionList = new ListWidgetAction(QStringList(), this);

   connect(mpActionList , &ListWidgetAction::sigSelectChange, this, &xxxxx::OnSelectChange);


   QMenu* pMenu= new QMenu(tr("xxx"), this);
    pMenu->addAction(mpActionList );

###########################################################

#ifndef _LISTWIDGETACTION_H_
#define _LISTWIDGETACTION_H_
#include
#include


class ListWidgetAction : public QWidgetAction 
{
    Q_OBJECT
public:
    ListWidgetAction(const QStringList& lstMenu, QWidget* pParent = NULL);


    void OnSelectChange();
    
signals:
    void sigSelectChange(QString strText);
    
private:
    QListWidget* mpListWidget;
};


#endif _LISTWIDGETACTION_H_

#########################################

#include "ListWidgetAction.h"


ListWidgetAction::ListWidgetAction(const QStringList& lstMenu, QWidget* pParent)
    : QWidgetAction(pParent)
{
    mpListWidget = new QListWidget(pParent);
    mpListWidget->setObjectName("ListWidgetAction");
    mpListWidget->setSelectionMode(QAbstractItemView::SingleSelection); 
    for (int i = 0; i < lstMenu.size(); i++)
    {
        mpListWidget->addItem(lstMenu.at(i));
    }
    connect(mpListWidget, &QListWidget::itemSelectionChanged, this, &ListWidgetAction::OnSelectChange);


    setDefaultWidget(mpListWidget);
}
    
void ListWidgetAction::OnSelectChange()
{
    if (mpListWidget->selectedItems().count() > 0)
    {
        QString strText = mpListWidget->selectedItems().at(0)->text();
        emit sigSelectChange(strText);            
        if (NULL != menu())
        {
            menu()->hide();
        }
    }
}


你可能感兴趣的:(QT,c&c++)