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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: signal mapping  (Прочитано 12974 раз)
Вячеслав
Гость
« Ответ #15 : Апрель 17, 2008, 20:25 »

Млин Грустный Нефиг в паралель с ДСП возиться ;(( Стормозил ....
Тогда уже ответили на поставленный вопрос - параметр по умолчанию Подмигивающий

Вторая ремарка была ответом на реплику  "почему нельзя узнать какого х.. позвали слот" .....
Записан
QCasper
Гость
« Ответ #16 : Апрель 17, 2008, 20:57 »

Млин Грустный Нефиг в паралель с ДСП возиться ;(( Стормозил ....
Тогда уже ответили на поставленный вопрос - параметр по умолчанию Подмигивающий

Вторая ремарка была ответом на реплику  "почему нельзя узнать какого х.. позвали слот" .....

Да и параметр по умолчанию вобщем-то тоже уже не в тему. Почитайте посты повнимательнее.
Записан
Sergeich
Гость
« Ответ #17 : Апрель 18, 2008, 13:39 »

Класс, отслеживающий испускание сигналов объектом. Параметр в сигнале emitted - идетификатор сигнала, который можно использовать в QMetaObject::method(int)
sigwatcher.h:
Код:
#ifndef SIGNAL_WATCHER
#define SIGNAL_WATCHER

#include <QObject>

class SignalWatcher : public QObject
{
Q_OBJECT
public:
SignalWatcher( QObject* obj );
private slots:
void dummy();
signals:
void emitted(int);
private:
bool event( QEvent* e );
QObject* wObj;
};

#endif // SIGNAL_WATCHER
sigwatcher.cpp:
Код:
#include "sigwatcher.h"
#include <QEvent>
#include <QMetaMethod>

#include <qobject_p.h> // hmmm... you can find it in $QTDIR/src/corelib/kernel

SignalWatcher::SignalWatcher( QObject* obj )
: QObject(obj), wObj(obj)
{
const QMetaObject* mo = wObj->metaObject();
int n = mo->methodCount();
for ( int i = 0; i < n; i++ ) {
QMetaMethod meth = mo->method(i);
if ( meth.methodType() == QMetaMethod::Signal ) {
    QByteArray sign = "0";
    sign[0] = sign[0] + QSIGNAL_CODE;
    sign += meth.signature();
    connect( wObj, sign, this, SLOT(dummy()), Qt::QueuedConnection );
}
}
}

bool SignalWatcher::event( QEvent* e )
{
if ( e->type() == QEvent::MetaCall ) {
QMetaCallEvent* me = (QMetaCallEvent*) e;
int sigId = me->signalIdStart();
emit emitted(sigId);
//debug
const QMetaObject* mo = wObj->metaObject();
QMetaMethod meth = mo->method(sigId);
qDebug("Signal %s emitted", meth.signature() );
//-----
return true;
}
return false;
}

void SignalWatcher::dummy()
{
}
Записан
QCasper
Гость
« Ответ #18 : Апрель 20, 2008, 11:33 »

Ужасы какие  Шокированный
Я решил пойти несколько другим путем:

signalmapper.h:

Код:
class SignalMapper : public QObject {
Q_OBJECT
public:
SignalMapper(QObject *parent = 0):QObject(parent) {}

void setMapping(QObject *object, const char *signal, int id);

signals:
void mapped(int id);

private:
QSignalMapper* freeMapper(QObject *object);

QMultiMap<QObject*, QSignalMapper*> m_SignalMappers;
};

signalmapper.cpp:

Код:
void SignalMapper::setMapping(QObject *object, const char *signal, int id) {
QSignalMapper *mapper = freeMapper(object);
connect(object, signal, mapper, SLOT(map()));
mapper->setMapping(object, id);
}
QSignalMapper* SignalMapper::freeMapper(QObject *object) {

QList<QSignalMapper*> mappers = m_SignalMappers.values();
for (int i=0; i<mappers.size(); i++) {
if (!m_SignalMappers.keys(mappers[i]).contains(object)) {
m_SignalMappers.insert(object, mappers[i]);
return mappers[i];
}
}

QSignalMapper *mapper = new QSignalMapper(this);
m_SignalMappers.insert(object, mapper);

connect(mapper, SIGNAL(mapped(int)), SIGNAL(mapped(int)));

return mapper;
}

Таким образом на каждый сигнал конкретного объекта выделяется по QSignalMapper'у. Но, чтобы напрасно не разбазаривать память, предусмотрена возможность использования уже выделенного маппера для других объектов.
Записан
EhTemka
Гость
« Ответ #19 : Май 05, 2008, 22:52 »

Прошу прощения, я не совсем удачно сформулировал вопрос. Допустим, что в классе С2 у меня один единственный слот с параметром типа int. Класс С1 имеет кучу сигналов: S1, S2, ... , Sn без параметров. Так вот мне нужно маппировать эти сигналы на слот класса С2 таким образом, чтобы в зависимости от сигнала S1, S2, ... или Sn, этот слот вызывался со значением параметра 1, 2, ... n соответственно.

или я что-то не понимаю, но зачем тебе куча сигналов, если можно пользоваться одним но с параметром типа int и емитить его в разные моменты с разным значением этого параметра, тем который и нужен твоему слоту...
Записан
QCasper
Гость
« Ответ #20 : Май 06, 2008, 00:12 »

Прошу прощения, я не совсем удачно сформулировал вопрос. Допустим, что в классе С2 у меня один единственный слот с параметром типа int. Класс С1 имеет кучу сигналов: S1, S2, ... , Sn без параметров. Так вот мне нужно маппировать эти сигналы на слот класса С2 таким образом, чтобы в зависимости от сигнала S1, S2, ... или Sn, этот слот вызывался со значением параметра 1, 2, ... n соответственно.

или я что-то не понимаю, но зачем тебе куча сигналов, если можно пользоваться одним но с параметром типа int и емитить его в разные моменты с разным значением этого параметра, тем который и нужен твоему слоту...

Потому, что класс C1 уже спроектирован, реализован и работает, втыкать туда костыли не хочется. Но даже если бы это было не так, то всеравно достаточно кривое решение, с каждым сигналом Sn вываливать еще и сигнал со значением n.
Записан
EhTemka
Гость
« Ответ #21 : Май 06, 2008, 16:06 »

с каждым сигналом Sn вываливать еще и сигнал со значением n

в сигналах Sn вообще нет никакой необходимости, так как они заменяются на сигнал S(int n)

Потому, что класс C1 уже спроектирован, реализован и работает, втыкать туда костыли не хочется

С этим не поспоришь Подмигивающий
Записан
QCasper
Гость
« Ответ #22 : Май 08, 2008, 20:39 »

с каждым сигналом Sn вываливать еще и сигнал со значением n

в сигналах Sn вообще нет никакой необходимости, так как они заменяются на сигнал S(int n)

Дело в том, что те, кто посылают эти сигналы это некоторые подсистемы, которые просто выполняют свою работу и пускают сигналы, в соответствии со спецификой работы конкретной подсистемы. В зависимости от этого, класс, контролирующий подсистемы должен сменить состояние всей системы в зависимости от сигнала. То есть конкретная подсистема не знает, какое значение нужно передать в сигнале.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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