Russian Qt Forum

Qt => Общие вопросы => Тема начата: unkeep от Ноябрь 02, 2016, 10:13



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


Название: Re: как получить QMetaMethod слота по указателю?
Отправлено: GreatSnake от Ноябрь 02, 2016, 11:20
Очень странно, я думал никаких проблем по указателю получить метаметод не будет, он же в конце концов где-то в каком-то виде его хранит...
Да ничего странного. В случае подобного коннекта используется уже не слот, а functor, на который мета-инфо просто отсутствует.


Название: Re: как получить QMetaMethod слота по указателю?
Отправлено: unkeep от Ноябрь 02, 2016, 12:13
Очень странно, я думал никаких проблем по указателю получить метаметод не будет, он же в конце концов где-то в каком-то виде его хранит...
Да ничего странного. В случае подобного коннекта используется уже не слот, а functor, на который мета-инфо просто отсутствует.

с коннектом-то понятно. Но если метод помечен как слот, QMetaMetod обязан же хранить указатель на метод. Или как по другому он сможет вызвать его??


Название: Re: как получить QMetaMethod слота по указателю?
Отправлено: GreatSnake от Ноябрь 02, 2016, 12:29
Но если метод помечен как слот, QMetaMetod обязан же хранить указатель на метод. Или как по другому он сможет вызвать его??
Наверное обязан и даже хранит его где-то у себя внутри. Но совершенно не обязан его нам отдавать.
Слот может быть вызван через QMetaObject::invokeMethod().


Название: Re: как получить QMetaMethod слота по указателю?
Отправлено: ssoft от Ноябрь 02, 2016, 16:59
По указателю не знаю как, а вот по сигнатуре получить можно

Код
C++ (Qt)
QMetaMethod method = obj->metaObject()->method( metaObject()->indexOfMethod( QMetaObject::normalizedSignature( "mySlot( int )" ); ) );
 


Название: Re: как получить QMetaMethod слота по указателю?
Отправлено: unkeep от Февраль 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 >