Russian Qt Forum

Qt => Общие вопросы => Тема начата: vladmailbox от Февраль 28, 2010, 17:37



Название: Поиск QAction в меню
Отправлено: 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() возвращает пустую строку. Как это победить? Или может можно это сделать как-то проще?


Название: Re: Поиск QAction в меню
Отправлено: SABROG от Февраль 28, 2010, 17:43
QAction::text()


Название: Re: Поиск QAction в меню
Отправлено: lit-uriy от Февраль 28, 2010, 17:49
>>для всех QAction objectName() возвращает пустую строку
А ты предварительно его задаёшь?


Название: Re: Поиск QAction в меню
Отправлено: vladmailbox от Март 01, 2010, 11:44
Нет. Но меню загружается для формы, и там имена прописаны.
Странно, неужели при загрузке формы имена не инициализируются?

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

то имя есть.


Название: Re: Поиск QAction в меню
Отправлено: SABROG от Март 01, 2010, 13:44
Проверь валиден ли указатель после qobject_cast.


Название: Re: Поиск QAction в меню
Отправлено: vladmailbox от Март 01, 2010, 15:02
Указатель валиден. Но хотя объект имеет тип QAction, в его properties стоят данные из parent QMenu.
 


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

Возможно qobject_cast козлит, попробуй через QObject::inherits("QAction") рассортировать.


Название: Re: Поиск QAction в меню
Отправлено: vladmailbox от Март 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);

Такой вариант работает.


Название: Re: Поиск QAction в меню
Отправлено: SABROG от Март 01, 2010, 18:12
Значит qobject_cast пофиг какой виджет в какой переводить.


Название: Re: Поиск QAction в меню
Отправлено: waster от Март 08, 2010, 17:48
В меню могут находиться не твои объекты QAction, а сделанные самой Qt, которые просто выглядят так же.

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