首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以创建一个可调整大小的QMenu?

是否可以创建一个可调整大小的QMenu?
EN

Stack Overflow用户
提问于 2014-04-02 12:54:08
回答 2查看 1.3K关注 0票数 7

我有一个弹出的QMenu,它在QListView中显示了很多图标:

代码语言:javascript
复制
QMenu*menu=createMenu();
QListView*list=createList();
QWidgetAction*action=new QWidgetAction(menu);
action->setDefaultWidget(list);
menu->addAction(action);
menu->show();

是否有使其可调整大小的方法?,即我希望能够拖动弹出式菜单的角并用鼠标调整弹出式菜单的大小。我无法在google或Qt文档中找到这一点。

EN

回答 2

Stack Overflow用户

发布于 2014-04-07 10:09:53

就像这样:

代码语言:javascript
复制
...
QListView*list=createList();
Qt::WindowFlags winFlags = list->windowFlags();
winFlags = winFlags & ~Qt::MSWindowsFixedSizeDialogHint;
list->setWindowFlags(winFlags);
...

或者menu上同样的事情

票数 1
EN

Stack Overflow用户

发布于 2014-04-07 08:53:04

您需要创建一个自定义弹出窗口小部件。我不知道如何正确地捕捉焦点事件,但通常的想法是:

MegaPopup.h

代码语言:javascript
复制
#ifndef MEGAPOPUP_H
#define MEGAPOPUP_H

#include <QWidget>
#include <QPointer>
#include <QListView>
#include <QStandardItemModel>
#include <QVBoxLayout>
#include <QAction>
#include <QVariant>
#include <QCursor>

class MegaPopup
    : public QWidget
{
    Q_OBJECT

private:
    enum Roles
    {
        ActionRole = Qt::UserRole,
    };

public:
    MegaPopup( QWidget *parent );
    ~MegaPopup();

    void addItem( QAction *action );

public slots:
    void showMenu();

private:
    QPointer< QListView > m_view;
    QPointer< QStandardItemModel > m_model;

private slots:
    void onClicked( const QModelIndex& index );
    void onDestroyed();
};

Q_DECLARE_METATYPE( QAction * )

#endif // MEGAPOPUP_H

MeraPopup.cpp

代码语言:javascript
复制
#include "MegaPopup.h"


MegaPopup::MegaPopup( QWidget *parent )
    : QWidget( parent, Qt::Window | Qt::CustomizeWindowHint )
{
    qRegisterMetaType< QAction * >();

    m_model = new QStandardItemModel( this );
    m_view = new QListView( this );
    QVBoxLayout *l = new QVBoxLayout();

    setLayout( l );
    l->addWidget( m_view );
    m_view->setModel( m_model );
    m_view->setViewMode( QListView::IconMode );

    connect( m_view, &QListView::clicked, this, &MegaPopup::onClicked );
}

MegaPopup::~MegaPopup()
{
}

void MegaPopup::addItem( QAction* action )
{
    Q_ASSERT( action );
    QStandardItem *item = new QStandardItem();

    // Magic
    item->setData( QVariant::fromValue< QAction * >( action ), ActionRole );
    item->setEnabled( action->isEnabled() );
    item->setFont( action->font() );
    item->setIcon( action->icon() );
    item->setText( action->text() );
    item->setToolTip( action->toolTip() );

    m_model->appendRow( item );

    connect( action, &QAction::destroyed, this, &MegaPopup::onDestroyed );
}

void MegaPopup::showMenu()
{
    move( QCursor::pos() );
    show();
}

void MegaPopup::onClicked( const QModelIndex& index )
{
    QStandardItem *item = m_model->itemFromIndex( index );
    QAction *action = item->data( ActionRole ).value< QAction * >();
    action->trigger();
    hide();
}

void MegaPopup::onDestroyed()
{
    QAction *toDel = qobject_cast< QAction * >( sender() );

    const int n = m_model->rowCount();
    for ( int i = 0; i < n; i++ )
    {
        QStandardItem *item = m_model->item( i );
        QAction *action = item->data( ActionRole ).value< QAction * >();
        if ( action == toDel )
        {
            delete item;
            break;
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22812171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档