В Qt 4.7, как можно добавить всплывающее меню к кнопке QToolbar?

Я новичок в Qt и сейчас играю с Qt Creator и сырым кодом на С++. Мне удалось получить некоторые простые функциональные возможности, включая меню и панель инструментов, добавив объекты QAction для обоих. Однако я испытываю определенные трудности:

Что бы я хотел сделать, это иметь пункт меню, который имеет подменю, например. Новый, с подменю с элементом элементов и дублируйте его на QToolbar. Я управлял им в меню: Новый как QMenu и элементы подменю как объекты QAction. Я не вижу, как заставить это работать на панели инструментов, например. Новая кнопка, которая при нажатии будет запускать "по умолчанию" QAction (например, первый элемент подменю), но с меньшей кнопкой меню справа, предлагающей все другие параметры. Я полагаю, что это аналогично кнопкам Undo/Redo на панелях инструментов Office.

Ответы

Ответ 1

Я считаю, что QToolButton виджет должен отлично работать для того, что вы пытаетесь сделать, посмотрите, будет ли и пример ниже работать для вас:

QMenu *menu = new QMenu();
QAction *testAction = new QAction("test menu item", this);
menu->addAction(testAction);

QToolButton* toolButton = new QToolButton();
toolButton->setMenu(menu);
toolButton->setPopupMode(QToolButton::InstantPopup);
toolBar->addWidget(toolButton);

надеюсь, что это поможет, считает

Ответ 2

Кажется, что QToolButton уже имеет какое-то подменю, которое устанавливается с помощью QToolButton::setPopupMode(ToolButtonPopupMode mode). Если у вас все получится, это будет место для начала: http://doc.qt.io/archives/qt-4.7/qtoolbutton.html#ToolButtonPopupMode-enum

Ответ 3

serge_gubenco ответ будет работать, за исключением случаев, когда нужно уменьшить размер окна, а Qt пытается поместить QToolButton в всплывающее меню. Возможно, это не удастся. См. http://doc.qt.io/archives/qt-4.7/qtoolbar.html.

Решение заключается в использовании быстрого QWidgetAction, как показано ниже в модифицированном фрагменте.

QMenu *menu = new QMenu();
QAction *testAction = new QAction("test menu item", this);
menu->addAction(testAction);

QToolButton* toolButton = new QToolButton();
toolButton->setMenu(menu);
toolButton->setPopupMode(QToolButton::InstantPopup);

QWidgetAction* toolButtonAction = new QWidgetAction(this);
toolButtonAction->setDefaultWidget(toolButton);

toolBar->addAction(toolButtonAction);