我在QToolBar上有一个菜单,方法是制作一个QAction并向其添加一个QMenu。如何在单击图标时消除菜单出现之前的延迟?
QToolBar *myToolBar = new QToolBar(this);
QAction *myAction = new QAction(helloIcon, 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);发布于 2015-05-08 22:17:44
正确的方法是自己在工具栏中插入QToolButton,而不是QAction。QToolButton类有一个popupMode属性,您可以在其中设置所需的模式(delayed、instantPopup、menu)。
下面是一个有效的示例:
QToolBar *myToolBar = new QToolBar(this);
QToolButton *myButton = new QToolButton();
QMenu *helloMenu = new QMenu(this);
QAction *actionWorld = helloMenu->addAction(tr("World"));
QAction *actionUniverse = helloMenu->addAction(tr("Universe"));
//set popup mode to InstantPopup so there will be no delay
myButton->setPopupMode(QToolButton::InstantPopup);
myButton->setMenu(helloMenu);
myButton->setIcon(helloIcon);
myButton->setText(tr("Hello"));
myToolBar->addWidget(myButton);发布于 2013-02-07 05:06:19
以下是实现它的一种方法,以便在打开菜单时不会出现延迟:
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}widget.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_Hwidget.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()定位菜单时,请记住不能依赖菜单的当前大小()。出于性能原因,菜单仅在必要时调整其大小,因此在许多情况下,显示前后的大小是不同的。取而代之的是使用sizeHint(),它根据菜单的当前内容计算适当的大小。
因此,如果你有一个非常复杂的菜单,这可能会有所帮助:
您应该在sizeHint显示之前尝试计算它;可能在上面的代码之后不久。这可能会减少稍后显示菜单的时间。
helloMenu->sizeHint();
// or you can try
qDebug() << helloMenu->sizeHint();如果这似乎没有帮助,您还可以尝试在QMenu上调用adjustSize(),看看它是否会更早地执行任何计算。
希望这能有所帮助。
发布于 2013-02-12 23:19:55
这应该会有帮助,但我不知道这是不是最好的解决方案:
#ifdef OS_WIN
#include <QWindowsStyle>
class FixPopupDelayWinStyle : public QWindowsStyle
{
public:
int styleHint(StyleHint hint, const QStyleOption* opt = 0, const QWidget* widget = 0, QStyleHintReturn* returnData = 0 ) const
{
if (hint == QStyle::SH_ToolButton_PopupDelay)
return 0;
return QWindowsStyle::styleHint(hint, opt, widget, returnData);
}
};
#endif
#ifdef OS_WIN
_toolBar_contains_action_with_Menu->setStyle(new FixPopupDelayWinStyle);
#endifhttps://stackoverflow.com/questions/14734767
复制相似问题