0

QAction を作成し、それに QMenu を追加して、QToolBar にメニューを作成しました。アイコンをクリックしたときにメニューが表示されるまでの遅延を取り除くにはどうすればよいですか?

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);
4

3 に答える 3

1

正しい方法は、QAction の代わりにツールバーに QToolButton を自分で挿入することです。QToolButton クラスには、目的のモード (delayed、instantPopup、メニュー) を設定できる popupMode プロパティがあります。

これが実際の例です:

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);
于 2015-05-08T14:17:44.083 に答える
0

メニューを開くときに遅延がないように実装する方法の 1 つを次に示します。

main.cpp

#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()));
}

ポップアップ使用上の注意

のドキュメントを見るとQMenu::popUp()、ジオメトリをチェックする前に sizeHint を設定することが言及されています。

exec() または popup() でメニューを配置するときは、メニューの現在の size() に依存できないことに注意してください。パフォーマンス上の理由から、メニューは必要な場合にのみサイズを調整するため、多くの場合、ショーの前後でサイズが異なります。代わりに、メニューの現在のコンテンツに応じて適切なサイズを計算する sizeHint() を使用してください。

したがって、非常に複雑なメニューがある場合は、これが役立つ場合があります。

sizeHint表示される前に を計算してみてください。おそらく上記のコードの直後。これにより、後でメニューを表示する時間が短縮される場合があります。

helloMenu->sizeHint();

// or you can try
qDebug() << helloMenu->sizeHint();

それでも問題が解決しない場合は、 を呼び出しadjustSize()て、QMenu以前に計算が実行されるかどうかを確認することもできます。

それが役立つことを願っています。

于 2013-02-06T21:06:19.000 に答える
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
于 2013-02-12T15:19:55.107 に答える