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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: sender() после invokeMethod() просьба проверить в последних версиях  (Прочитано 9274 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Декабрь 16, 2014, 21:12 »

Кто пользуется последними версиями Qt, просьба проверить - после invokeMethod() внутри слота-получателя QObject::sender() тоже 0 возвращает?
Записан

2^7-1 == 127, задумайтесь...
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 16, 2014, 21:32 »

Проверить не могу, но должно возвращать, по-идее. Это же не сигналом вызван слот.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Декабрь 16, 2014, 21:34 »

хоть бы тестовый проект скинул
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Декабрь 16, 2014, 21:38 »

хоть бы тестовый проект скинул
Плюсадин этому господину.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Декабрь 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();}

и запустить
« Последнее редактирование: Декабрь 16, 2014, 22:19 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Декабрь 16, 2014, 22:08 »

Проверить не могу, но должно возвращать, по-идее. Это же не сигналом вызван слот.

Я тоже так думаю, но в Qt 4.7 получаю пока 0  Грустный может баг версии...
« Последнее редактирование: Декабрь 16, 2014, 22:19 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Декабрь 16, 2014, 22:33 »

Проверить не могу, но должно возвращать, по-идее. Это же не сигналом вызван слот.

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #7 : Декабрь 16, 2014, 22:39 »

Проверить не могу, но должно возвращать, по-идее. Это же не сигналом вызван слот.

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

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

2^7-1 == 127, задумайтесь...
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Декабрь 16, 2014, 22:51 »

Инвокнуть метод можно из любого класса или вообще свободной функции. Подмигивающий
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Декабрь 16, 2014, 22:57 »

возвращает 0 в 4.8.5, 5.3.2 и 5.4
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #10 : Декабрь 16, 2014, 23:01 »

Инвокнуть метод можно из любого класса или вообще свободной функции. Подмигивающий

В любом случае его нельзя инвокнуть без QMetaObject::metaObject(), а эта функция в this получает указатель на объект, который вызывает. То есть, всегда есть этот указатель.
« Последнее редактирование: Декабрь 16, 2014, 23:03 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #11 : Декабрь 16, 2014, 23:08 »

Её можно вообще из любого кода вызвать. Так что 0 - вполне ожидаемое и нормальное поведение.

PS прям из main вызывайте. Интересно какой this будет Улыбающийся
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #12 : Декабрь 16, 2014, 23:19 »

Её можно вообще из любого кода вызвать. Так что 0 - вполне ожидаемое и нормальное поведение.

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

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

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

« Последнее редактирование: Декабрь 16, 2014, 23:22 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #13 : Декабрь 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.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Декабрь 17, 2014, 07:36 »

В любом случае его нельзя инвокнуть без QMetaObject::metaObject(), а эта функция в this получает указатель на объект, который вызывает. То есть, всегда есть этот указатель.
Вы ошибаетесь, invokeMethod статическая функция, никакой this ей не нужен.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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