我有一个弹出的QMenu,它在QListView中显示了很多图标:
QMenu*menu=createMenu();
QListView*list=createList();
QWidgetAction*action=new QWidgetAction(menu);
action->setDefaultWidget(list);
menu->addAction(action);
menu->show();

是否有使其可调整大小的方法?,即我希望能够拖动弹出式菜单的角并用鼠标调整弹出式菜单的大小。我无法在google或Qt文档中找到这一点。
发布于 2014-04-07 10:09:53
就像这样:
...
QListView*list=createList();
Qt::WindowFlags winFlags = list->windowFlags();
winFlags = winFlags & ~Qt::MSWindowsFixedSizeDialogHint;
list->setWindowFlags(winFlags);
...或者menu上同样的事情
发布于 2014-04-07 08:53:04
您需要创建一个自定义弹出窗口小部件。我不知道如何正确地捕捉焦点事件,但通常的想法是:
MegaPopup.h
#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_HMeraPopup.cpp
#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;
}
}
}https://stackoverflow.com/questions/22812171
复制相似问题