Russian Qt Forum

Qt => Общие вопросы => Тема начата: Dodge от Декабрь 05, 2007, 14:30



Название: [Qt 4.3.2] Что есть QMetaMethod::Method?
Отправлено: Dodge от Декабрь 05, 2007, 14:30
В классе QMetaMethod есть метод methodType, возвращающиий тип метода. С сигналом и слотом все ясно, а вот что в данном случае будет являтся методом? Погонял это дело на своих и qt'шных классах (наследованных от qobject), и ни разу не наткнулся на метод с таким типом.

Поясню откуда у вопроса ноги растут. Из Qt Script'а мозно вызывать методы объектов зарегестрированных в движке, но только методы с типом сигнал/слот, т.о. к обычному паблику из скрипта не добраться. Получается что, если хочешь использовать qt'шный класс в скрипте, то буть добр оберни, и сделай все нужные функции слотами. Бред.

Тут пришла в голову мысля(от сотрудника ;D), что если можно получить доступ к мета-методам, то можно написать ретранслятор, который бы в себе мог создовать(в динамике) слоты, к которым можно приконнектится(тоже в динамике), и при их вызове вызывать соответствующие методы у целевого объекта.

Мысли есть какие нибуть?


Название: Re: [Qt 4.3.2] Что есть QMetaMethod::Method?
Отправлено: pastor от Декабрь 05, 2007, 14:53
Непойму зачем городить такой огород. Чем собственно не устраивает слот?


Название: Re: [Qt 4.3.2] Что есть QMetaMethod::Method?
Отправлено: Dodge от Декабрь 05, 2007, 14:59
Я согласен что это огород, но:
1. Очень интересная конструкция.
2. Универсальность, ретранслятору можно былобы подсунуть любой объект, сконфигурить его и дальше не парится.
3. Надаж всетаки узнать что есть QMetaMethod::Method ;D


Название: Re: [Qt 4.3.2] Что есть QMetaMethod::Method?
Отправлено: vaprele07 от Декабрь 05, 2007, 15:20
см Q_INVOKABLE


Название: Re: [Qt 4.3.2] Что есть QMetaMethod::Method?
Отправлено: pastor от Декабрь 05, 2007, 15:23
Можно закрутить цикл и проверить что есть что (сам лично никогда это не использова). Ну например так:


Код:
QMetaObject *meta_object = <some_object>->metaObject();

for (int i = 0; i < meta_object->methodCount(); ++i) {
    QMetaMethod meta_metod = meta_object->method(i);
    switch(meta_metod.methodType()) {
        case QMetaMethod::Signal:
            <do_something>
            break;
         case QMetaMethod::Slot:
            <do_something>
            break;
          case QMetaMethod::Method:
            <do_something>
            break;
    }
}

В каждой ветке свича можно вывести информацию: parameterNames, parameterTypes, signature etc.


Название: Re: [Qt 4.3.2] Что есть QMetaMethod::Method?
Отправлено: Dodge от Декабрь 05, 2007, 17:19
Можно закрутить цикл и проверить что есть что (сам лично никогда это не использова). Ну например так:


Код:
QMetaObject *meta_object = <some_object>->metaObject();

for (int i = 0; i < meta_object->methodCount(); ++i) {
    QMetaMethod meta_metod = meta_object->method(i);
    switch(meta_metod.methodType()) {
        case QMetaMethod::Signal:
            <do_something>
            break;
         case QMetaMethod::Slot:
            <do_something>
            break;
          case QMetaMethod::Method:
            <do_something>
            break;
    }
}

В каждой ветке свича можно вывести информацию: parameterNames, parameterTypes, signature etc.
Это вообще к чему?

vaprele07 спс, разобрался.

QMetaMethod::Method это метод класса объявленный в секции паблик с исп макроса Q_INVOKABLE.
Например:
Код:
class MyTest : public QObject {
public:
    ...
    Q_INVOKABLE void test();
    void test2();

};
test и будет иметь тип - метод.

Меня интересует почему в данном случае test2 не является мета-методом... о нем вообще отсутствует информация в мета обжекте... сразу напрашивается следующее: метакомилятор не может отличить конструктор/диструктор объекта от метода.
Позже проверю и выложу результаты дабы полностью закрыть тему.