这是实现它的一种方法,以便在打开菜单时没有延迟:
主文件
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
小部件.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMenu>
#include <QToolBar>
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
signals:
public slots:
void on_myAction();
private:
QMenu * helloMenu;
QToolBar *myToolBar;
};
#endif // WIDGET_H
小部件.cpp
#include "widget.h"
#include <QAction>
#include <QMenu>
#include <QWidget>
Widget::Widget(QWidget *parent) :
QWidget(parent)
{
myToolBar = new QToolBar(this);
QAction *myAction = new QAction(tr("Hello"), this);
myToolBar->addAction(myAction);
helloMenu = new QMenu(this);
QAction *actionWorld = helloMenu->addAction(tr("World"));
QAction *actionUniverse = helloMenu->addAction(tr("Universe"));
myAction->setMenu(helloMenu);
QObject::connect(myAction, SIGNAL(triggered()), this, SLOT(on_myAction()));
}
void Widget::on_myAction()
{
helloMenu->popup(myToolBar->mapToGlobal(myToolBar->geometry().bottomLeft()));
}
使用 PopUp 的注意事项
在查看 的文档时QMenu::popUp()
,它指的是在检查几何之前设置 sizeHint。
使用 exec() 或 popup() 定位菜单时,请记住您不能依赖菜单的当前 size()。出于性能原因,菜单仅在必要时调整其大小,因此在许多情况下,节目前后的大小是不同的。相反,使用 sizeHint() 根据菜单的当前内容计算适当的大小。
因此,如果您有一个非常复杂的菜单,这可能会有所帮助:
sizeHint
您应该在显示之前尝试计算;可能在您上面的代码之后不久。这可能会减少稍后显示菜单的时间。
helloMenu->sizeHint();
// or you can try
qDebug() << helloMenu->sizeHint();
如果这似乎没有帮助,您也可以尝试调用adjustSize()
以QMenu
查看它是否会更早地执行任何计算。
希望有帮助。