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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Default action для виджета  (Прочитано 6092 раз)
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 197


Просмотр профиля
« : Февраль 09, 2021, 09:58 »

Добрый день.
У QMenu есть default action. А если действия привязаны непосредственно к виджету? Можно задать умолчальное? QMenu в этом случае наружу не торчит, его показывает сам виджет, и ссылку на QMenu из виджета программно получить вроде как невозможно?
« Последнее редактирование: Апрель 02, 2021, 09:31 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #1 : Февраль 09, 2021, 10:37 »

Вы бы лучше конкретно сказали, что именно вам нужно?
А ссылку на глобальное меню (или подменю) можно получить из любого виджета на форме. Просто запросив это меню из toplevelwidget.
Записан

DarkHobbit
Самовар
**
Offline Offline

Сообщений: 197


Просмотр профиля
« Ответ #2 : Февраль 09, 2021, 11:08 »

А ссылку на глобальное меню (или подменю) можно получить из любого виджета на форме. Просто запросив это меню из toplevelwidget.
Каким образом? topLevelWidet() возвращает опять-таки QWidget*. Как по QWidget получить привязанное к нему QMenu? Я только список actions() вижу.
Записан

Мои проекты на Qt: DoubleContact, LInvert
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 197


Просмотр профиля
« Ответ #3 : Март 23, 2021, 21:14 »

Вы бы лучше конкретно сказали, что именно вам нужно?

А нужно мне примерно следующее...

Код:
    QMenu* m = new QMenu(this);
    m->addAction("act1", this, SLOT(sl1()));
    m->addAction("act2", this, SLOT(sl2()));
    m->addAction("act3", this, SLOT(sl3()));
    m->setDefaultAction(m->actions().last());
    m->setGeometry(ui->btnTestMenu->x(), ui->btnTestMenu->y(), m->width(), m->height());
    m->exec();

Вот когда такое делаешь руками, самостоятельно создаёшь QMenu, пункт "act3" выделяется жирным. Ну а если не руками, если через addAction у __виджета__? Можно так?
« Последнее редактирование: Март 24, 2021, 06:49 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Март 24, 2021, 11:41 »

Можно задать умолчальное?
Можно перед menu.exec() выбрать/подсветить default item и разместить меню так чтобы мышь была на нем
Записан
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 197


Просмотр профиля
« Ответ #5 : Март 25, 2021, 10:29 »

выбрать/подсветить default item
Я, возможно, туплю, но опять-таки как? setDefautAction() есть у QMenu, тут вопросов нет.

А когда мы оперируем QWidget::addAction()... У QWidget выхода на QMenu нет (или я его не вижу). У самого QAction тоже нет никакого setDefault, setHighlited, ничего такого.

И да, в случае с QWidget::addAction() никакого QMenu::exec() в моей программе нет. Как нет и самого QMenu. Меню создаётся и вызывается самим виджетом из действий, которое я ему задавал. С одной стороны, это удобно, и меню вызывается "по месту". С другой, получается, некоторые возможности пропадают?..
« Последнее редактирование: Март 25, 2021, 10:33 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Март 25, 2021, 11:28 »

но опять-таки как?

.. Меню создаётся и вызывается самим виджетом из действий,
Да, придется написать (и навесить) фильтр где создавать и выполнять меню. Не нужно слишком привыкать к удобствам, это развращает  Улыбающийся
Записан
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 197


Просмотр профиля
« Ответ #7 : Март 28, 2021, 22:45 »

Не нужно слишком привыкать к удобствам, это развращает  Улыбающийся

Ну это не только удобство, это минус некоторое количество лишнего кода, в котором теряется функциональность программы.

И раз такая пьянка, то я лучше откажусь от этой идеи с Default Action. Тем более, как я обнаружил, оно не на всех платформах работает. Клавишу Return на нужный Action добавлю - и хватит.
Записан

Мои проекты на Qt: DoubleContact, LInvert
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 197


Просмотр профиля
« Ответ #8 : Апрель 02, 2021, 09:30 »

В принципе, можно выставить contextMenuPolicy в Qt::CustomContextMenu, да и повесить обработку сигнала QWidget::customContextMenuRequested. Он даже указывает, где меню рисовать, останется только сам объект QMenu создать и нашпиговать его действиями.

Отмечу тему как решённую. Но всё равно ощущение некоторой нелогичности остаётся, получается, упрощённый способ создания меню несёт урезание функциональности, хотя ничего не мешало конкретно этот момент довести до ума...
Записан

Мои проекты на Qt: DoubleContact, LInvert
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Апрель 02, 2021, 09:52 »

Но всё равно ощущение некоторой нелогичности остаётся, ..
Вы знаете - у меня тоже Улыбающийся Поясните что такое "default для меню" ? Какой рез-т ожидается? Мышь работает  "позиционно" - куда нажал, то и получил. Нажал мимо - ничего не произошло. Что же должен делать "default" Непонимающий

Ну это не только удобство, это минус некоторое количество лишнего кода, в котором теряется функциональность программы.
Это спорно. Во всяком случае лазание по фичам тоже отнимает немало времени. И "развивает" до определенного предела  Улыбающийся
Записан
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 197


Просмотр профиля
« Ответ #10 : Апрель 04, 2021, 14:48 »

Поясните что такое "default для меню" ?

Цитировать
The default action may have a visual cue, depending on the current QStyle. A default action usually indicates what will happen by default when a drop occurs

Тут, конечно, можно интересоваться, что имеется в виду под дропом, но обычно это то же действие, которое выполняется без меню по нажатию энтером или даблклику. Может выделяться жирным. Короче - подсказка пользователю. Например, в виндовом проводнике жирным обычно выделяется команда "Открыть". И там действительно можно вызвать у выбранного файла меню и выбрать "Открыть", а можно просто долбануть Enter.

Проблема в том, что это выделение жирным работает не всегда. Как следует из процитированного - зависит от QStyle. Можно подобрать нужный QStyle, но тогда может "съехать" что-то ещё, UI начнёт выдержать чужеродно и др. (Но вот в Qt/Windows, например, оно видно из коробки без манипуляций со стилями.) Поэтому я вот тоже начинаю склоняться к тому, что действительно, за такую цену эта рюшечка, наверное, не нужна.

А жаль. Хотелось "сделать красиво".
Записан

Мои проекты на Qt: DoubleContact, LInvert
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Апрель 05, 2021, 10:30 »

Может выделяться жирным. Короче - подсказка пользователю. Например, в виндовом проводнике жирным обычно выделяется команда "Открыть". И там действительно можно вызвать у выбранного файла меню и выбрать "Открыть", а можно просто долбануть Enter.
Ну блин, нашли авторитет Улыбающийся Вот мы открыли меню (хоть контекстное) и мышь отрубилась. Можно менять selection клавишами и enter соответствует выбору, это нормально. Теперь мы затеваем еще чего-то с "жирным" - ну явно моветон. Неудивительно что порядочные ОС  так не делают.

Поэтому я вот тоже начинаю склоняться к тому, что действительно, за такую цену эта рюшечка, наверное, не нужна.

А жаль. Хотелось "сделать красиво"
Ну добавить хвильтр - максимум полчаса, в основном на посчитать позицию айтема. Хотелось "только ис каропки", чего уж там "жаль" Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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