Russian Qt Forum

Qt => Уроки и статьи => Тема начата: sa_mel от Сентябрь 05, 2013, 21:15



Название: HowTo: Еще раз о QAction и QMenu
Отправлено: sa_mel от Сентябрь 05, 2013, 21:15
На Форуме есть тема QAction и QMenu (http://www.prog.org.ru/topic_4461_0.html), в которой был задан следующий вопрос

Цитата: Lion
Если QAction полученный от QMenu::menuAction() добавить в тулбар, то можно вызвать это меню только по нажатию на маленькую стрелку у кнопки. Как заставить вылезть меню при нажатии на саму кнопку?

Прошло 6 лет, а вопрос фактически остался без ответа. Что-либо "нагуглить" на других ресурсах тоже не получится. Поэтому решил изложить свое видение пути решения проблемы.

Итак, пусть главное окно приложения сконструировано в дизайнере форм, и в главном меню имеется меню Open (с именем menuOpen), в котором выбирается формат открываемого файла

(http://qtlinux.narod.ru/images/RussianQtForum/MainMenuOpen.png)

Можно поместить это меню (и не только это) на ToolBar, вставив в конструкторе MainWindow следующий код

Код
C++ (Qt)
ui->mainToolBar->addAction(ui->menuOpen->menuAction());
 

Результат иллюстрируется ниже

(http://qtlinux.narod.ru/images/RussianQtForum/ToolBarMenuOpen.png)

Действительно, меню раскрывается только при нажатии на стрелку рядом с кнопкой, а при нажатии на саму кнопку ничего не присходит. Чтобы увидеть каким образом можно расширить функциональные возможности данного интерфейса, поместим меню на 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);
 

Теперь меню будет раскрываться при нажатии на саму кнопку, а стрелочка лишь информирует о том, что за кнопкой закреплено меню, а не одно действие. Изменился и внешний вид кнопки

(http://qtlinux.narod.ru/images/RussianQtForum/ToolBarToolButtonOpen.png)

Полученный интерфейс будет удобен при портировании приложения на мобильную платформу с сенсорным экраном. Ведь стрелочка-то маааленькая! И попасть в нее пальцем пользователю будет нелегко.

Теперь вернемся к значению 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);
 

Теперь при нажатии на стрелочку раскрывается меню для выбора формата открываемого файла, а при нажатии на саму кнопку будет выбран текстовый формат файла (как бы по умолчанию) и вызвано действие, предусмотренное Вами для его открытия. Остается добавить, что за кнопкой может быть закреплено любое действие (не обязятельно из меню).


Название: Re: Еще раз о QAction и QMenu
Отправлено: Bepec от Сентябрь 05, 2013, 21:24
Это конечно интересно и увлекательно - красиво оформлено, с картинками, но почему вы не добавили это в конец той темы?


Название: Re: HowTo: Еще раз о QAction и QMenu
Отправлено: sa_mel от Сентябрь 05, 2013, 21:28
При попытке добавить ответ в ту тему смутило сообщение

Внимание: в этой теме не было ответов в течение, по крайней мере 120 дней.
Возможно стоит рассмотреть вариант открытия новой темы.


Название: Re: Еще раз о QAction и QMenu
Отправлено: xintrea от Сентябрь 08, 2013, 03:30
Это конечно интересно и увлекательно - красиво оформлено, с картинками, но почему вы не добавили это в конец той темы?

Пусть будет здесь. Это действительно ховто. В той теме можно поместить ссылку сюда.