Russian Qt Forum
Май 05, 2024, 11:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: HowTo: Еще раз о QAction и QMenu  (Прочитано 10626 раз)
sa_mel
Гость
« : Сентябрь 05, 2013, 21:15 »

На Форуме есть тема QAction и QMenu, в которой был задан следующий вопрос

Цитата: Lion
Если 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);
 

Теперь при нажатии на стрелочку раскрывается меню для выбора формата открываемого файла, а при нажатии на саму кнопку будет выбран текстовый формат файла (как бы по умолчанию) и вызвано действие, предусмотренное Вами для его открытия. Остается добавить, что за кнопкой может быть закреплено любое действие (не обязятельно из меню).
« Последнее редактирование: Сентябрь 06, 2013, 17:32 от sa_mel » Записан
Bepec
Гость
« Ответ #1 : Сентябрь 05, 2013, 21:24 »

Это конечно интересно и увлекательно - красиво оформлено, с картинками, но почему вы не добавили это в конец той темы?
Записан
sa_mel
Гость
« Ответ #2 : Сентябрь 05, 2013, 21:28 »

При попытке добавить ответ в ту тему смутило сообщение

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

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Сентябрь 08, 2013, 03:30 »

Это конечно интересно и увлекательно - красиво оформлено, с картинками, но почему вы не добавили это в конец той темы?

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

Собираю информацию по крупицам
http://webhamster.ru
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.122 секунд. Запросов: 23.