crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему
> как идентифицировать сигнал, идентифицировать сигнал
fantom
  опции профиля:
сообщение 30.1.2009, 17:45
Сообщение #21


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


Точно! Спасибо все работает.
    for( int i = 0; i < this->metaObject()->methodCount(); ++i)
    {
        QMetaMethod mm = this->metaObject()->method( i);
        const char *p = mm.signature();
    if (mm.methodType() == QMetaMethod::Signal)
    qDebug() << p;
    }

И еще вопрос. Индекс сигнала у объекта всегда постоянен в рамках неизменности описания класса?

В итоге что вышло. Чтобы получить имя сигнала вызвавшего слот в Qt 4.4.x можно сделать так.
#include "qobject_p.h"
void Test::testSlot()
{
    QObjectPrivate* sh = reinterpret_cast<QObjectPrivate*>(this->d_ptr);
    int idSignal = sh->currentSender->signal;
    for( int i = 0; i < this->metaObject()->methodCount(); ++i)
    {
        QMetaMethod mm = this->metaObject()->method( i);
        const char *p = mm.signature();
    if (mm.methodType() == QMetaMethod::Signal)
    {
        if (idSignal == metaObject()->indexOfSignal(p))
        qDebug() << "Name of Signal" << p;
    }
    }
}

Хотя кончено это не совсем правомерно но работает. Надо тролям писать чтобы реализовали метод получения имени сигнала!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.1.2009, 11:30
Сообщение #22


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(fantom @ 30.1.2009, 17:45) *
В итоге что вышло. Чтобы получить имя сигнала вызвавшего слот в Qt 4.4.x можно сделать так.
Можно упростить:
#include "qobject_p.h"
void Test::testSlot()
{
    QObjectPrivate* sh = reinterpret_cast<QObjectPrivate*>(this->d_ptr);
    int idSignal = sh->currentSender->signal;
    QMetaMethod mm = this->metaObject()->method( idSignal);
    const char *p = mm.signature();
    if (mm.methodType() == QMetaMethod::Signal)
    {
        qDebug() << "Name of Signal" << p;
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.1.2009, 11:54
Сообщение #23


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Обсуждение связанное с Vedga перенес в существующую тему. тык
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 31.1.2009, 13:23
Сообщение #24


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(fantom @ 29.1.2009, 16:57) *
так как мне необходимо идентифицировать стандартные сигналы qt. Например от кнопок и др элементов.


Этот код работает только в пределах одного объекта, который выпускает и ловит сигнал.
Т.е. при нажатии на кнопку мы уже не получим имя сигнала, которое было у QPushButton'а. А d_ptr чужих объектов естественно закрыт.

Кстати без reinterpret_cast тоже работает:

#include "private/qobject_p.h" //у меня только так захотел находить заголовок
...
qint32 idSignal = ((QObjectPrivate*)d_ptr)->currentSender->signal;


Сообщение отредактировал SABROG - 31.1.2009, 13:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 2.2.2009, 17:34
Сообщение #25


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


Цитата(SABROG @ 31.1.2009, 13:23) *
Этот код работает только в пределах одного объекта, который выпускает и ловит сигнал.

Ты прав. Я об этом не подумал. Но это лечится. Достаточно ввести новый класс
class Q_Object: public QObject
{
Q_OBJECT
public:
using QObject::d_ptr;
};


И теперь уже все объекты от которых надо идентифицировать сигналы унаследовать уже от него, а не от QObject
Проверил исправленный код у меня вроде работает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 2.2.2009, 18:45
Сообщение #26


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


fantom

Цитата(fantom @ 2.2.2009, 17:34) *
Цитата(SABROG @ 31.1.2009, 13:23) *
Этот код работает только в пределах одного объекта, который выпускает и ловит сигнал.

Ты прав. Я об этом не подумал. Но это лечится. Достаточно ввести новый класс
class Q_Object: public QObject
{
Q_OBJECT
public:
using QObject::d_ptr;
};


И теперь уже все объекты от которых надо идентифицировать сигналы унаследовать уже от него, а не от QObject
Проверил исправленный код у меня вроде работает.


Чувствую, что где-нибудь в другом месте косяк потом с этим вылезет. Например с чужими плагинами или библиотеками.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 2.2.2009, 19:18
Сообщение #27


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


Ну чтобы не вылезло можешь в каждом своем наследнике от QObject писать
public:
using QObject::d_ptr;

Этим мы просто говорим чтобы поле d_ptr стало public. Тогда никаких проблем быть не должно.
Конечно понимаю что все это изврат и костыли, но если очень надо то больше вариантов я не знаю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 2.2.2009, 20:39
Сообщение #28


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


fantom

Цитата(fantom @ 2.2.2009, 19:18) *
Ну чтобы не вылезло можешь в каждом своем наследнике от QObject писать
public:
using QObject::d_ptr;

Этим мы просто говорим чтобы поле d_ptr стало public. Тогда никаких проблем быть не должно.
Конечно понимаю что все это изврат и костыли, но если очень надо то больше вариантов я не знаю.


Я говорю об объектах, реализация которых скрыта в файлах библиотек. Есть только хедер и .lib/.a файл.
И о проектах в исходники которых тебе не захочется лезть. Например комплексные, встраиваемые виджеты с кучей дочерних элементов. Придется много кода переписать, чтобы их всех "отнаследовать".

Может это можно как-то по-нормальному сделать? Если все коннекты мы сами делаем, то почему-бы не "запитать" пришедший сигнал на наш слот-ретранслятор, например slt_btn_clicked(). Далее emitим' сигнал дальше на обработчик:

emit sig_btn_clicked(sender(), "clicked");


Соотв. все зеркальные сигналы законнектить на один слот.в нас.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 3.2.2009, 17:01
Сообщение #29


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


SABROG ты сам запутался и меня запутал. короче никаких using и наследований использывать не надо. Вот так все работает.
void Test::testSlot()
{
    QObjectPrivate* sh = reinterpret_cast<QObjectPrivate*>(this->d_ptr);
    int idSignal = sh->currentSender->signal;
        QMetaMethod mm = (sender())->metaObject()->method( idSignal );
        const char *p = mm.signature();
    qDebug() << "Name of Signal" << p;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 3.2.2009, 18:02
Сообщение #30


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


:) ну теперь, по идее, должно все работать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  < 1 2 3 4 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.11.2024, 8:07