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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Поиск QAction в меню  (Прочитано 5731 раз)
vladmailbox
Гость
« : Февраль 28, 2010, 17:37 »

Для поиска нужного пункта меню по имени использую такой код:
Код
C++ (Qt)
QAction * findAction(QObjectList lst, QString menuname)
{
   for( QObjectList::const_iterator it = lst.begin(); it != lst.end(); ++it )
   {
       if( QAction *act = qobject_cast<QAction*>(*it) )
       {
           QString name = act->objectName();
           if( menuname.compare( name, Qt::CaseInsensitive ) == 0 )
               return act;
       }
       else if( QMenu *mnu = qobject_cast<QMenu*>(*it) )
       {
           QAction * act = findAction(mnu->children(), menuname);
           if( act != 0 ) return act;
       }
   }
   return 0;
}
 
 
QAction * act = findAction(this->menuBar()->children());
 
И это не работает. Более того, в отладчике видно, что для всех QAction objectName() возвращает пустую строку. Как это победить? Или может можно это сделать как-то проще?
« Последнее редактирование: Март 01, 2010, 12:45 от Пантер » Записан
SABROG
Гость
« Ответ #1 : Февраль 28, 2010, 17:43 »

QAction::text()
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Февраль 28, 2010, 17:49 »

>>для всех QAction objectName() возвращает пустую строку
А ты предварительно его задаёшь?
Записан

Юра.
vladmailbox
Гость
« Ответ #3 : Март 01, 2010, 11:44 »

Нет. Но меню загружается для формы, и там имена прописаны.
Странно, неужели при загрузке формы имена не инициализируются?

Кроме того, если запросить так:
 QAction * act = this->ui->mnuExit;
 QString name = act->objectName();

то имя есть.
Записан
SABROG
Гость
« Ответ #4 : Март 01, 2010, 13:44 »

Проверь валиден ли указатель после qobject_cast.
Записан
vladmailbox
Гость
« Ответ #5 : Март 01, 2010, 15:02 »

Указатель валиден. Но хотя объект имеет тип QAction, в его properties стоят данные из parent QMenu.
 
Записан
SABROG
Гость
« Ответ #6 : Март 01, 2010, 15:17 »

Указатель валиден. Но хотя объект имеет тип QAction, в его properties стоят данные из parent QMenu.

Возможно qobject_cast козлит, попробуй через QObject::inherits("QAction") рассортировать.
Записан
vladmailbox
Гость
« Ответ #7 : Март 01, 2010, 18:00 »

В конце концов написал так:

QAction * findAction(QObjectList lst, QString &menuname)
{
    for( QObjectList::const_iterator it = lst.begin(); it != lst.end(); ++it )
    {
        if( (*it)->inherits("QAction") )
        {
            QAction *act =  qobject_cast<QAction*>(*it);
            QString name = act->objectName();
            if( menuname.compare( name, Qt::CaseInsensitive ) == 0 )
                return act;
        }
    }
    return 0;
}


QAction *act = findAction(this->children(), menuname);

Такой вариант работает.
Записан
SABROG
Гость
« Ответ #8 : Март 01, 2010, 18:12 »

Значит qobject_cast пофиг какой виджет в какой переводить.
Записан
waster
Гость
« Ответ #9 : Март 08, 2010, 17:48 »

В меню могут находиться не твои объекты QAction, а сделанные самой Qt, которые просто выглядят так же.

После фикса проверь ещё QWidgetAction: он может работать по-другому (например, я знаю, что он не откликается на некоторые евенты, на которые откликается QAction, типа вывода мышки за пределы элемента). Похоже, про него просто забыли при разработке Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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