Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: yarick от Апрель 27, 2013, 07:21



Название: Связать число с пунктом меню
Отправлено: yarick от Апрель 27, 2013, 07:21
Меню формируется динамически из списка и мне нужно узнать при клике, какой именно элемент связан с ним. Попытался поработать с QAction и setData - однако он почему-то "не видит" данные после клика.

Код:
QAction* act = menu->addAction("someName", this, SLOT(onClickMenuSlot()));
act->setData(1234);
Однако при клике на мункте меню и вызове в слоте
Код:
menu->activeAction()
равняется 0 по непонятной причине


Название: Re: Связать число с пунктом меню
Отправлено: Bepec от Апрель 27, 2013, 07:50
sender() вас спасёт.
Почитайте  про него :)


Название: Re: Связать число с пунктом меню
Отправлено: Alex Custov от Апрель 27, 2013, 18:07
Код:
menu->activeAction()
равняется 0 по непонятной причине

так клик не имеет отношения к activeAction().


Название: Re: Связать число с пунктом меню
Отправлено: Vamireh от Апрель 27, 2013, 18:08
либо dynamic_cast<QAction*>(sender()), либо QSignalMapper


Название: Re: Связать число с пунктом меню
Отправлено: yarick от Апрель 27, 2013, 18:51
Действительно помогло, спасибо большое.  dynamic_cast<QAction*>(sender()) - то что нужно


Название: Re: Связать число с пунктом меню
Отправлено: Syveren от Май 02, 2013, 09:21
Мне кажется лучше использовать qobject_cast, вместо dynamic_cast.
qobject_cast<QAction*>(sender())


Название: Re: Связать число с пунктом меню
Отправлено: panAlexey от Май 03, 2013, 09:22
Мне кажется лучше использовать qobject_cast, вместо dynamic_cast.
qobject_cast<QAction*>(sender())
А где-бы почитать про эти qobject_cast и dynamic_cast.
Детально, вразумительно и желат. по русски.


Название: Re: Связать число с пунктом меню
Отправлено: Bepec от Май 03, 2013, 09:30
QObject в ассистенте :)
dinamic_cast  в стандарте С++.

Смысл обоих - если неправильное преобразование, т.е. не в предка или наследника, то возвращается нуль.

А QObject просто заточен под Qt и QObject'ы.


Название: Re: Связать число с пунктом меню
Отправлено: schmidt от Май 13, 2013, 00:05
dynamic_cast отжирает много процессорного времени :) Вообще смысл его в том, чтобы корректно приводить указатели базовых/производных классов в иерархии. Если преобразование не вписывается в иерархию, dynamic_cast вернет 0. Но такое отслеживание дорого обходится во время исполнения программы, чаще всего вызов dynamic_cast сопряжен с операциями сравнения строк (имен классов) - и чем больше классов в иерархии, тем тяжелей проходит каждый вызов dynamic_cast. Не стоит стрелять из пушки по воробьям, ведь кроме QAction в вашем слоте больше неоткуда появиться другим типам, если конечно вы не подключаете к нему с десяток сигналов от разных виджетов, что маловероятно )