Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: DarkHobbit от Февраль 09, 2021, 09:58



Название: [РЕШЕНО] Default action для виджета
Отправлено: DarkHobbit от Февраль 09, 2021, 09:58
Добрый день.
У QMenu есть default action. А если действия привязаны непосредственно к виджету? Можно задать умолчальное? QMenu в этом случае наружу не торчит, его показывает сам виджет, и ссылку на QMenu из виджета программно получить вроде как невозможно?


Название: Re: Default action для виджета
Отправлено: tux от Февраль 09, 2021, 10:37
Вы бы лучше конкретно сказали, что именно вам нужно?
А ссылку на глобальное меню (или подменю) можно получить из любого виджета на форме. Просто запросив это меню из toplevelwidget.


Название: Re: Default action для виджета
Отправлено: DarkHobbit от Февраль 09, 2021, 11:08
А ссылку на глобальное меню (или подменю) можно получить из любого виджета на форме. Просто запросив это меню из toplevelwidget.
Каким образом? topLevelWidet() возвращает опять-таки QWidget*. Как по QWidget получить привязанное к нему QMenu? Я только список actions() вижу.


Название: Re: Default action для виджета
Отправлено: DarkHobbit от Март 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 у __виджета__? Можно так?


Название: Re: Default action для виджета
Отправлено: Igors от Март 24, 2021, 11:41
Можно задать умолчальное?
Можно перед menu.exec() выбрать/подсветить default item и разместить меню так чтобы мышь была на нем


Название: Re: Default action для виджета
Отправлено: DarkHobbit от Март 25, 2021, 10:29
выбрать/подсветить default item
Я, возможно, туплю, но опять-таки как? setDefautAction() есть у QMenu, тут вопросов нет.

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

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


Название: Re: Default action для виджета
Отправлено: Igors от Март 25, 2021, 11:28
но опять-таки как?

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


Название: Re: Default action для виджета
Отправлено: DarkHobbit от Март 28, 2021, 22:45
Не нужно слишком привыкать к удобствам, это развращает  :)

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

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


Название: Re: Default action для виджета
Отправлено: DarkHobbit от Апрель 02, 2021, 09:30
В принципе, можно выставить contextMenuPolicy в Qt::CustomContextMenu, да и повесить обработку сигнала QWidget::customContextMenuRequested. Он даже указывает, где меню рисовать, останется только сам объект QMenu создать и нашпиговать его действиями.

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


Название: Re: Default action для виджета
Отправлено: Igors от Апрель 02, 2021, 09:52
Но всё равно ощущение некоторой нелогичности остаётся, ..
Вы знаете - у меня тоже :) Поясните что такое "default для меню" ? Какой рез-т ожидается? Мышь работает  "позиционно" - куда нажал, то и получил. Нажал мимо - ничего не произошло. Что же должен делать "default" ???

Ну это не только удобство, это минус некоторое количество лишнего кода, в котором теряется функциональность программы.
Это спорно. Во всяком случае лазание по фичам тоже отнимает немало времени. И "развивает" до определенного предела  :)


Название: Re: Default action для виджета
Отправлено: DarkHobbit от Апрель 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, например, оно видно из коробки без манипуляций со стилями.) Поэтому я вот тоже начинаю склоняться к тому, что действительно, за такую цену эта рюшечка, наверное, не нужна.

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


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

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

А жаль. Хотелось "сделать красиво"
Ну добавить хвильтр - максимум полчаса, в основном на посчитать позицию айтема. Хотелось "только ис каропки", чего уж там "жаль" :)