メニューを開くときに遅延がないように実装する方法の 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
以前に計算が実行されるかどうかを確認することもできます。
それが役立つことを願っています。