Russian Qt Forum

Qt => Общие вопросы => Тема начата: Гурман от Декабрь 16, 2014, 21:12



Название: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: Гурман от Декабрь 16, 2014, 21:12
Кто пользуется последними версиями Qt, просьба проверить - после invokeMethod() внутри слота-получателя QObject::sender() тоже 0 возвращает?


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: Пантер от Декабрь 16, 2014, 21:32
Проверить не могу, но должно возвращать, по-идее. Это же не сигналом вызван слот.


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: kambala от Декабрь 16, 2014, 21:34
хоть бы тестовый проект скинул


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: Пантер от Декабрь 16, 2014, 21:38
хоть бы тестовый проект скинул
Плюсадин этому господину.


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: Гурман от Декабрь 16, 2014, 22:08
А чего, никто простой рабочий проект открытый не имеет?

в каком-то одном Q-объекте, который работает при запуске

Код:
QObject* test;
metaObject()->invokeMethod( &someQObject, "testMethod", Q_RETURN_ARG(QObject*,test), Q_ARG(QString,"sender: "));
qDebug() << test;

в каком-то другом Q-объекте, указатель на который выше передан в someQObject, прямо в описателе его класса:

Код:
QObject* testMethod(QString s) { qDebug() << s; return sender();}

и запустить


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: Гурман от Декабрь 16, 2014, 22:08
Проверить не могу, но должно возвращать, по-идее. Это же не сигналом вызван слот.

Я тоже так думаю, но в Qt 4.7 получаю пока 0  :( может баг версии...


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: Пантер от Декабрь 16, 2014, 22:33
Проверить не могу, но должно возвращать, по-идее. Это же не сигналом вызван слот.

Я тоже так думаю, но в Qt 4.7 получаю пока 0  :( может баг версии...
Я имел ввиду, что sender должен быть nullptr, ибо вызов не через сигнал.


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: Гурман от Декабрь 16, 2014, 22:39
Проверить не могу, но должно возвращать, по-идее. Это же не сигналом вызван слот.

Я тоже так думаю, но в Qt 4.7 получаю пока 0  :( может баг версии...
Я имел ввиду, что sender должен быть nullptr, ибо вызов не через сигнал.

А какая разница??? Механизм используется фактически тот же, даже может также вызывать напрямую или через очередь. Вызывает также QObject, как и в случае сигнала. То есть, указатель на отправителя тоже известен.


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: Пантер от Декабрь 16, 2014, 22:51
Инвокнуть метод можно из любого класса или вообще свободной функции. ;)


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: kambala от Декабрь 16, 2014, 22:57
возвращает 0 в 4.8.5, 5.3.2 и 5.4


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: Гурман от Декабрь 16, 2014, 23:01
Инвокнуть метод можно из любого класса или вообще свободной функции. ;)

В любом случае его нельзя инвокнуть без QMetaObject::metaObject(), а эта функция в this получает указатель на объект, который вызывает. То есть, всегда есть этот указатель.


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: Bepec от Декабрь 16, 2014, 23:08
Её можно вообще из любого кода вызвать. Так что 0 - вполне ожидаемое и нормальное поведение.

PS прям из main вызывайте. Интересно какой this будет :)


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: Гурман от Декабрь 16, 2014, 23:19
Её можно вообще из любого кода вызвать. Так что 0 - вполне ожидаемое и нормальное поведение.

PS прям из main вызывайте. Интересно какой this будет :)

Из main можно вызвать как static функцию - и будет у неё честный this на некоторый объект. Как у любой static функции. Ну и фик с ним. В таком случае можно было бы и 0 передавать.

Зато можно было бы вызывать как свой мета-метод из QObject, и тогда в слоте можно было бы автоматом получить указатель на вызывающего, и ответить ему с помощью такого же invokeMethod(). А на 0 все равно проверять всегда надо.



Название: Re: sender() после invokeMethod() просьба проверить в последних k
Отправлено: Johnik от Декабрь 17, 2014, 00:12
В документации четко написано:
Код
C++ (Qt)
QObject * QObject::sender() const [protected]
Код:
Returns a pointer to the object that sent the signal, if called in a slot activated by a signal; otherwise it returns 0.


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: Old от Декабрь 17, 2014, 07:36
В любом случае его нельзя инвокнуть без QMetaObject::metaObject(), а эта функция в this получает указатель на объект, который вызывает. То есть, всегда есть этот указатель.
Вы ошибаетесь, invokeMethod статическая функция, никакой this ей не нужен.


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: Igors от Декабрь 17, 2014, 09:36
Из main можно вызвать как static функцию - и будет у неё честный this на некоторый объект. Как у любой static функции.
Мне об этом ничего не известно. Какой this у static метода   ???

возвращает 0 в 4.8.5, 5.3.2 и 5.4
Хоть бы спасибо сказал  :)



Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: _OLEGator_ от Декабрь 17, 2014, 10:12
Добавил бы в слот дополнительный аргумент с QObject* и все, а то столько страданий не из-за чего.


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: Гурман от Декабрь 17, 2014, 12:26

возвращает 0 в 4.8.5, 5.3.2 и 5.4
Хоть бы спасибо сказал  :)



Спасибо.


Название: Re: sender() после invokeMethod() просьба проверить в последних версиях
Отправлено: Гурман от Декабрь 17, 2014, 12:28
Добавил бы в слот дополнительный аргумент с QObject* и все, а то столько страданий не из-за чего.

Так приходится добавлять его при каждом вызове с помощью invokeMethod.