QToolBar的菜单延迟

时间:2013-02-06 17:07:28

标签: qt

我在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);

3 个答案:

答案 0 :(得分:1)

正确的方法是在工具栏中自己插入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);

答案 1 :(得分:0)

以下是实现它的一种方法,以便在打开菜单时没有延迟:

的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_H

widget.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();

如果这似乎没有帮助,您也可以尝试在adjustSize()上调用QMenu,看看它是否会提前执行任何计算。

希望有所帮助。

答案 2 :(得分:0)

这应该有所帮助,但我不知道它是否是最好的解决方案:

#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);
#endif