Russian Qt Forum
Май 18, 2012, 20:18
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
(Модератор:
Sergeich
) >
signal mapping
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: signal mapping (Прочитано 3913 раз)
Вячеслав
Гость
Re: signal mapping
«
Ответ #15 :
Апрель 17, 2008, 20:25 »
Млин
Нефиг в паралель с ДСП возиться ;(( Стормозил ....
Тогда уже ответили на поставленный вопрос - параметр по умолчанию
Вторая ремарка была ответом на реплику "почему нельзя узнать какого х.. позвали слот" .....
Записан
QCasper
Супер активный житель
Offline
Сообщений: 765
Re: signal mapping
«
Ответ #16 :
Апрель 17, 2008, 20:57 »
Цитата: Вячеслав от Апрель 17, 2008, 20:25
Млин
Нефиг в паралель с ДСП возиться ;(( Стормозил ....
Тогда уже ответили на поставленный вопрос - параметр по умолчанию
Вторая ремарка была ответом на реплику "почему нельзя узнать какого х.. позвали слот" .....
Да и параметр по умолчанию вобщем-то тоже уже не в тему. Почитайте посты повнимательнее.
Записан
Sergeich
Moderator
Супер активный житель
Offline
Сообщений: 787
Сферический писец в вакууме
Re: signal mapping
«
Ответ #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
Супер активный житель
Offline
Сообщений: 765
Re: signal mapping
«
Ответ #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
Частый гость
Offline
Сообщений: 220
Re: signal mapping
«
Ответ #19 :
Май 05, 2008, 22:52 »
Цитата: QCasper от Апрель 16, 2008, 21:57
Прошу прощения, я не совсем удачно сформулировал вопрос. Допустим, что в классе С2 у меня один единственный слот с параметром типа int. Класс С1 имеет кучу сигналов: S1, S2, ... , Sn без параметров. Так вот мне нужно маппировать эти сигналы на слот класса С2 таким образом, чтобы в зависимости от сигнала S1, S2, ... или Sn, этот слот вызывался со значением параметра 1, 2, ... n соответственно.
или я что-то не понимаю, но зачем тебе куча сигналов, если можно пользоваться одним но с параметром типа int и емитить его в разные моменты с разным значением этого параметра, тем который и нужен твоему слоту...
Записан
..Это всё ошибка в матрице,
Что-то там не так перемножено,
Что слишком уж близко к заднице
Голова наша расположена...
QCasper
Супер активный житель
Offline
Сообщений: 765
Re: signal mapping
«
Ответ #20 :
Май 06, 2008, 00:12 »
Цитата: EhTemka от Май 05, 2008, 22:52
Цитата: QCasper от Апрель 16, 2008, 21:57
Прошу прощения, я не совсем удачно сформулировал вопрос. Допустим, что в классе С2 у меня один единственный слот с параметром типа int. Класс С1 имеет кучу сигналов: S1, S2, ... , Sn без параметров. Так вот мне нужно маппировать эти сигналы на слот класса С2 таким образом, чтобы в зависимости от сигнала S1, S2, ... или Sn, этот слот вызывался со значением параметра 1, 2, ... n соответственно.
или я что-то не понимаю, но зачем тебе куча сигналов, если можно пользоваться одним но с параметром типа int и емитить его в разные моменты с разным значением этого параметра, тем который и нужен твоему слоту...
Потому, что класс C1 уже спроектирован, реализован и работает, втыкать туда костыли не хочется. Но даже если бы это было не так, то всеравно достаточно кривое решение, с каждым сигналом Sn вываливать еще и сигнал со значением n.
Записан
EhTemka
Частый гость
Offline
Сообщений: 220
Re: signal mapping
«
Ответ #21 :
Май 06, 2008, 16:06 »
Цитата: QCasper от Май 06, 2008, 00:12
с каждым сигналом Sn вываливать еще и сигнал со значением n
в сигналах Sn вообще нет никакой необходимости, так как они заменяются на сигнал S(int n)
Цитата: QCasper от Май 06, 2008, 00:12
Потому, что класс C1 уже спроектирован, реализован и работает, втыкать туда костыли не хочется
С этим не поспоришь
Записан
..Это всё ошибка в матрице,
Что-то там не так перемножено,
Что слишком уж близко к заднице
Голова наша расположена...
QCasper
Супер активный житель
Offline
Сообщений: 765
Re: signal mapping
«
Ответ #22 :
Май 08, 2008, 20:39 »
Цитата: EhTemka от Май 06, 2008, 16:06
Цитата: QCasper от Май 06, 2008, 00:12
с каждым сигналом Sn вываливать еще и сигнал со значением n
в сигналах Sn вообще нет никакой необходимости, так как они заменяются на сигнал S(int n)
Дело в том, что те, кто посылают эти сигналы это некоторые подсистемы, которые просто выполняют свою работу и пускают сигналы, в соответствии со спецификой работы конкретной подсистемы. В зависимости от этого, класс, контролирующий подсистемы должен сменить состояние всей системы в зависимости от сигнала. То есть конкретная подсистема не знает, какое значение нужно передать в сигнале.
Записан
Страниц:
1
[
2
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
=> Архив
===> Программирование
=====> Python
===> Веб программирование
=====> PHP, PERL, CGI
Загружается...