На Форуме есть тема
QAction и QMenu, в которой был задан следующий вопрос
Если QAction полученный от QMenu::menuAction() добавить в тулбар, то можно вызвать это меню только по нажатию на маленькую стрелку у кнопки. Как заставить вылезть меню при нажатии на саму кнопку?
Прошло 6 лет, а вопрос фактически остался без ответа. Что-либо "нагуглить" на других ресурсах тоже не получится. Поэтому решил изложить свое видение пути решения проблемы.
Итак, пусть главное окно приложения сконструировано в дизайнере форм, и в главном меню имеется меню Open (с именем menuOpen), в котором выбирается формат открываемого файла
Можно поместить это меню (и не только это) на ToolBar, вставив в конструкторе MainWindow следующий код
C++ (Qt)
ui->mainToolBar->addAction(ui->menuOpen->menuAction());
Результат иллюстрируется ниже
Действительно, меню раскрывается только при нажатии на стрелку рядом с кнопкой, а при нажатии на саму кнопку ничего не присходит. Чтобы увидеть каким образом можно расширить функциональные возможности данного интерфейса, поместим меню на ToolBar альтернативным способом. В этом нам поможет следующий код
C++ (Qt)
QToolButton *tb = new QToolButton(ui->mainToolBar);
tb->setPopupMode(QToolButton::MenuButtonPopup);
tb->setMenu(ui->menuOpen);
tb->setIcon(ui->menuOpen->icon());
ui->mainToolBar->addWidget(tb);
Можно убедиться, что результат получается в точности такой же. Но теперь мы получаем возможность модифицировать код, чтобы изменить поведение кнопки. Для этого достаточно изменить одну строчку
C++ (Qt)
QToolButton *tb = new QToolButton(ui->mainToolBar);
tb->setPopupMode(QToolButton::InstantPopup);
tb->setMenu(ui->menuOpen);
tb->setIcon(ui->menuOpen->icon());
ui->mainToolBar->addWidget(tb);
Теперь меню будет раскрываться при нажатии на саму кнопку, а стрелочка лишь информирует о том, что за кнопкой закреплено меню, а не одно действие. Изменился и внешний вид кнопки
Полученный интерфейс будет удобен при портировании приложения на мобильную платформу с сенсорным экраном. Ведь стрелочка-то маааленькая! И попасть в нее пальцем пользователю будет нелегко.
Теперь вернемся к значению QToolButton::MenuButtonPopup, которое может устанавливаться для свойства popupMode кнопки. На самом деле в нем есть глубокий смысл. Ведь может возникнуть ситуация, когда потребуется, чтобы меню раскрывалось именно при нажатии на стрелочку, а при нажатии на саму кнопку выполнялось бы какое-либо другое действие. Приведенный ниже код, напрмер, назначает кнопке выбор для открытия текстового файла
C++ (Qt)
QToolButton *tb = new QToolButton(ui->mainToolBar);
tb->setPopupMode(QToolButton::MenuButtonPopup);
tb->setDefaultAction(ui->actionOpenText);
tb->setMenu(ui->menuOpen);
tb->setIcon(ui->menuOpen->icon());
ui->mainToolBar->addWidget(tb);
Теперь при нажатии на стрелочку раскрывается меню для выбора формата открываемого файла, а при нажатии на саму кнопку будет выбран текстовый формат файла (как бы по умолчанию) и вызвано действие, предусмотренное Вами для его открытия. Остается добавить, что за кнопкой может быть закреплено любое действие (не обязятельно из меню).