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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как получить QMetaMethod слота по указателю?  (Прочитано 4491 раз)
unkeep
Гость
« : Ноябрь 02, 2016, 10:13 »

есть статическая функция QMetaMethod::fromSignal(FuncPtr) для сигналов. А для слотов нету. Функция MetaObject::static_metacall(QMetaObject::IndexOfMethod, 0, args), которая используется в реализации fromSignal для слотов не работает.
Очень странно, я думал никаких проблем по указателю получить метаметод не будет, он же в конце концов где-то в каком-то виде его хранит...
« Последнее редактирование: Ноябрь 02, 2016, 10:27 от unkeep » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Ноябрь 02, 2016, 11:20 »

Очень странно, я думал никаких проблем по указателю получить метаметод не будет, он же в конце концов где-то в каком-то виде его хранит...
Да ничего странного. В случае подобного коннекта используется уже не слот, а functor, на который мета-инфо просто отсутствует.
Записан

Qt 5.11/4.8.7 (X11/Win)
unkeep
Гость
« Ответ #2 : Ноябрь 02, 2016, 12:13 »

Очень странно, я думал никаких проблем по указателю получить метаметод не будет, он же в конце концов где-то в каком-то виде его хранит...
Да ничего странного. В случае подобного коннекта используется уже не слот, а functor, на который мета-инфо просто отсутствует.

с коннектом-то понятно. Но если метод помечен как слот, QMetaMetod обязан же хранить указатель на метод. Или как по другому он сможет вызвать его??
« Последнее редактирование: Ноябрь 02, 2016, 12:24 от unkeep » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Ноябрь 02, 2016, 12:29 »

Но если метод помечен как слот, QMetaMetod обязан же хранить указатель на метод. Или как по другому он сможет вызвать его??
Наверное обязан и даже хранит его где-то у себя внутри. Но совершенно не обязан его нам отдавать.
Слот может быть вызван через QMetaObject::invokeMethod().
Записан

Qt 5.11/4.8.7 (X11/Win)
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #4 : Ноябрь 02, 2016, 16:59 »

По указателю не знаю как, а вот по сигнатуре получить можно

Код
C++ (Qt)
QMetaMethod method = obj->metaObject()->method( metaObject()->indexOfMethod( QMetaObject::normalizedSignature( "mySlot( int )" ); ) );
 
Записан
unkeep
Гость
« Ответ #5 : Февраль 09, 2017, 11:49 »

Хорошо. Пусть нельзя получить QMetaMethod по указателю на метод...

Как тогда реализовать макрос DECLARE_METHOD, чтобы замапить "указатель на метод" на "имя метода"?
Код
C++ (Qt)
class ISomeClass
{
public:
   virtual void someMethod() = 0;
};
 
DECLARE_METHOD(&ISomeClass::someMethod)
 

и где-то можно было вызвать:
Код
C++ (Qt)
QString name = getMethodName(&ISomeClass::someMethod);
 

P.S такая реализация не собирается:
Код
C++ (Qt)
template<typename Func>
struct MyMetaMethod
{
};
 
#define DECLARE_METHOD(Func)                \
template <>                                            \
struct MyMetaMethod< Func >                     \
{                                                             \
   static QString name() {return #Func;}       \
};                                                             \
 
 
template<typename Func>
QString getMethodName(Func)
{
   return MyMetaMethod<Func>::name();
}
 
Цитировать
expected a type, got '&ISomeClass::someMethod'
struct MyMetaMethod< Func >
« Последнее редактирование: Февраль 09, 2017, 12:05 от unkeep » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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