crossplatform.ru

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

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


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


единственное что приходит в гоолову это так как вы собираетесь переопределять виджеты
Цитата
..
необходимые для нас виджеты будут переопределены
...

переопределить и стандартные сигналы
...
connect(this,SIGNAL(clicked()),this,SLOT(sendClicked()));// перенаправление стандартного сигнала
...
void sendClicked() {
emit sgClicked(параметр);//этот сигнал соединить со слотом обработчиком и оп параметру определять что за /////сигнал вызвал слот.
}
...


как я понял необходимо определить не только сигнл но объект который его послал. т.к. если будет несколько объектов одного типа стандартные сигналы у них называются одинаково то параметр в сигнале спасает + если он целого типа то значительно упрощает обработку в слоте приемнике.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.1.2009, 13:47
Сообщение #12


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

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

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




Репутация:   94  


fantom, Если я правильно понял конечную цель, то предлагаю посмотреть на готовое решение: Vedga
Суть проста. На клиента ставится спецпрограмма Vedga-client, прога пишется одна для сервера, но не чистая Qt там в часности соединение сигналов идет другими функциями. написаное прложение запускается на сервере. А клиенты пользуются им с помощью Vedga-client.

Подробности по указанной ссылке, и ниже там смотри ссылку "Обсудить..."

Дальнейшее обсуждение связанное с Vedga перенес в существующую тему. тык
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 30.1.2009, 15:17
Сообщение #13


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

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

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




Репутация:   40  


По всей видимости стандартных путей нет.

Если хаком, то по всей видимости тебе нужно достучаться до класса QObjectPrivate, в нем есть структура Sender:
class Q_CORE_EXPORT QObjectPrivate : public QObjectData
{
    Q_DECLARE_PUBLIC(QObject)
public:
    // ...
    struct Sender
    {
        QObject *sender;
        int signal;
        int ref;
    };

    // object currently activating the object
    Sender *currentSender;
    //...
};
signal - это индекс сигнала, благодаря которому ты сможешь получить имя сигнала с помощью QMetaObject.

Судя по коду указатель на QObjectPrivate хранится в d_ptr
class Q_CORE_EXPORT QObject
{
    // ...
protected:
    QObjectData *d_ptr;
    // ...
};


Если я все правильно понял по сырцам...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 30.1.2009, 16:06
Сообщение #14


Студент
*

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

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




Репутация:   1  


ViGOur вы исходники какой версии qt смотрели? У меня 4.3.2 и в классе QObjectPrivate да и вообще нигде нет структуры Sender.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 30.1.2009, 16:08
Сообщение #15


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

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

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




Репутация:   40  


Блин, забыл что у вас 4.3.2, я смотрел 4.4.0. Сейчас гляну можно ли нахаляву хакнуть в 4.3.2.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 30.1.2009, 16:17
Сообщение #16


Студент
*

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

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




Репутация:   1  


да.
в 4.4 должно как то так работать
int signalId = (reinterpret_cast<QObjectPrivate*>(this->d_ptr))->currentSender->signal;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 30.1.2009, 16:17
Сообщение #17


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

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

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




Репутация:   40  


В вашей версии есть такой аргумент как QObjectPrivate::currentSenderSignalIdStart.
Гляньте в qtdir/src/corelib/kernel/qobject.cpp в методе bool QObject::event(QEvent *e) есть такой код:
    case QEvent::MetaCall:
        {
            Q_D(QObject);
            QMetaCallEvent *mce = static_cast<QMetaCallEvent*>(e);
            QObject *previousSender = d->currentSender;
            int previousFrom = d->currentSenderSignalIdStart;
            int previousTo = d->currentSenderSignalIdEnd;
            d->currentSender = const_cast<QObject*>(mce->sender());
            d->currentSenderSignalIdStart = mce->signalIdStart();
            d->currentSenderSignalIdEnd = mce->signalIdEnd();
#if defined(QT_NO_EXCEPTIONS)
            mce->placeMetaCall(this);
#else
            try {
                mce->placeMetaCall(this);
            } catch (...) {
                QReadLocker locker(QObjectPrivate::readWriteLock());
                if (QObjectPrivate::isValidObject(this)) {
                    d->currentSender = previousSender;
                    d->currentSenderSignalIdStart = previousFrom;
                    d->currentSenderSignalIdEnd = previousTo;
                }
                throw;
            }
#endif
            QReadLocker locker(QObjectPrivate::readWriteLock());
            if (QObjectPrivate::isValidObject(this)) {
                d->currentSender = previousSender;
                d->currentSenderSignalIdStart = previousFrom;
                d->currentSenderSignalIdEnd = previousTo;
            }
            break;
        }
А вот какзацепиться за currentSenderSignalIdStart, нужно думать...

Сообщение отредактировал ViGOur - 30.1.2009, 16:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 30.1.2009, 16:42
Сообщение #18


Студент
*

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

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




Репутация:   1  


Кстати а как получить имя сигнала по индексу? Вроде хак по крайней мере на 4.4.2 прокатил.

Или как получить список всех сигналов объекта?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 30.1.2009, 17:24
Сообщение #19


Студент
*

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

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




Репутация:   1  


Ну судя по metaObject()->indexOfSignal обращение через QObjectPrivate работает верно..
Но все же как получить список сигналов как это делает qt designer?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 30.1.2009, 17:24
Сообщение #20


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

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

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




Репутация:   40  


Цитата(fantom @ 30.1.2009, 16:42) *
Или как получить список всех сигналов объекта?

Примерно так:
    for( int i = 0; i < this->metaObject()->methodCount(); ++i)
    {
        QMetaMethod mm = this->metaObject()->method( i);
        const char *p = mm.signature();
    }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.4.2024, 4:25