LINUX.ORG.RU

Как вызвать выполнение действия QAction с проверкой, разрешено ли действие

 ,


0

1

Экземпляр класса QAction можно сделать запрещенным к исполнению, если установить ему setEnabled(false).

Проблема в том, что даже если экземпляр QAction запрещен, то можно вызвать метод trigger(), и QAction испустит сигнал triggered(). Соответственно, привязанное действие выполнится, несмотря на то, что QAction находится в состоянии «запрещено».

Вопрос: а как вызвать выполнение действия с проверкой, активно оно или нет? Причем эту проверку не делать в стороннем коде, а чтобы сам QAction не выполняло действие, если оно запрещено?


То есть, другими словами, нужно программно нажать кнопку на тулбаре, которая была добавлена как QAction. Но чтобы действие не выполнялось, если кнопка неактивна.

★★★★★

Ну первое, что приходит в голову:

if (action.isEnabled())
    action.trigger();

rumgot ★★★★★
()
Ответ на: комментарий от AUX

Проверка на isEnabled() не?

Ты предлагаешь делать вот что:

if(object->actionAddNew->isEnabled())
  object->actionAddNew->trigger();

Но это неправильно. Не должен сторонний код проверять разрешено ли действие. Само действие должно проверять, разрешено ли оно. И выполняться только если разрешено. Поэтому я написал: «Причем эту проверку не делать в стороннем коде, а чтобы сам QAction не выполняло действие, если оно запрещено».

Может быть есть какой-то другой способ активации действия, не через прямой вызов trigger(), но я о нем не знаю?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от rumgot

А почему ты сам вызываешь trigger() ?

А как по-другому программно нажать кнопку?

Точнее, более общий вопрос: как по-другому запустить действие? Но чтобы оно запустилось, если оно разрешено.

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от Xintrea

А зачем программно вызывать действие?

rumgot ★★★★★
()
Ответ на: комментарий от Xintrea

Еще можно унаследоваться от QAction - но это больше телодвижений, чем через проверку isEnabled().

rumgot ★★★★★
()
Ответ на: комментарий от Xintrea

А как по-другому программно нажать кнопку?

Чел меняй подход к программированию. Не тупи...

AUX ★★★
()
Ответ на: комментарий от Xintrea

А как по-другому программно нажать кнопку?

кнопке вопще должно быть пофик, что она там вызывает по нажатию и разрешено ли ей это делать - ее дело послать сигнал контроллеру «меня нажали» и все.

можно или нельзя выполнять какое-то действие в данный момент - проверяется в контроллере. соответственно, кнопку нужно делать disable|enable.

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

conalex ★★★
()
Ответ на: комментарий от conalex

Ты прав. Почему-то думал, что смогу в лоб обойтись интерфейсом самого действия.

Xintrea ★★★★★
() автор топика

Херасе запросы. Скажите, вы ведь судя по всему совсем недавно занимаетесь программированием, раз такие вопросы возникают?

B00
()
Ответ на: комментарий от B00

Qt - большой фреймверк, так же как и язык C++. Профессионального общения у меня нет, потому что удаленка. Когда туплю, могу только в тырнете помощи искать.

Я представлял себе QAction таким классом, который помогает отвязаться от понятия «Кнопка», «Пункт меню» и т. д., и перейти в плоскость выполнения действий, которые связываются в видимыми элементами интерфейса. Когда я рассматриваю абстракцию «Действие», то ожидаю, что у него будет метод «Выполнить». Но в QAction ничего подобного нет. Поэтому я эту абстракцию в Qt не до конца понимаю. Есть слот trigger(), но это слот, а не метод, и при его срабатывании испускается сигнал triggered(). Я этот слот конечно могу вызвать напрямую, но это идеологически неверно.

Еще больше запутывает возможность указывать для действия состояние «Активно»/«Неактивно». Вроде бы, если такое состояние есть, то логично, что при вызове «Выполнить» состояние должно проверяться. Но метода «Выполнить» нет, а суррогат в виде trigger() состояние не проверяет.

То есть, получается, что QAction - это по факту странный класс, который не инкапсулирует понятие «Действие», а на самом деле является этаким обобщением понятий «Кнопка», «Пункт меню», «Чекбокс» и т.д. И об этом говорит весь интерфейс QAction. Но додуматься до этого сразу очень сложно.

Возможно, вы это делаете легко, а мне такую аналитику провести сложно, нужно потыкаться и поразмышлять несколько дней. А времени нет, знающих людей под рукой тоже нет, поэтому приходится скатываться на примитив, чтоб быстро решить вопрос.

Пользователь conalex все правильно сказал, и самое интересное, что я эту инфраструктуру давно и заранее построил, с контроллером и всеми делами:

https://github.com/xintrea/mytetra_dev/tree/experimental/app/src/controllers/...

Но я с этим проектом работаю урывками, отвлекаясь от других проектов. Поэтому вспомнить всю структуру проекта и по каким принципам я его делал, быстро не могу, ибо нужно глубокое погружение. По моей практике у меня уходит больше месяца на проект размером 50 000 строк и более. Никто этого времени мне не даст. Поэтому что имеем, то имеем.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

В реализации слота можно получить указатель на объект пославший сигнал. Profit?

onhydro
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.