LINUX.ORG.RU

[Qt] передача сигнала из подклассов

 


0

2

Кому-нибудь приходилось решать задачу передачи сигнала из самого нижнего подкласса в самый верхний, добавляя дополнительные параметры?

т.е. есть класс верхнего уровня, внутри него еще класс с сигналом, в это внутреннем еще один сигнал...

Задача - передать с самого низа наверх. Так придется писать слоты в среднем и верхнем классе и эстафетой передавать сигнал. Мне кажется это несколько плохой метод.

Есть ли возможность передать это более элегантно и быстро? Не выводы подклассы в public область видимости. Или я что-то стандартное просмотрел?

Можно соединять сигналы с сигналами, но я все равно не понял задачи.

rival ★★
()

перегрузка слотов с вызовом базовых методов напрямую...

Jetty ★★★★★
()

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

trex6 ★★★★★
()
Ответ на: комментарий от MikeDM

ок, т.е. QEvent он может исходить из глубин подклассов и быть видимым на верхнем уровне? тогда определенно подходит :) если сработает - отмечу тему как решенную

почему-то думал о QSignalMapper, который подходит лишь наполовину

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от rival

Ты уверен, что тебе все это нужно? Может быть опишешь задачу?

я же пытался описать... ладно, код

class low : public QObject
{
signals:
    void sig_new_data(QByteArray data);
};

class medium : public QObject
{
private:
    low instance_of_low1;
    low instance_of_low2;
};

class high : public QObject
{
private:
    medium instance_of_medium1;
    medium instance_of_medium2;
    medium instance_of_medium3;
};

по этому примеру видно что в итоге получается целых 6 low (в каждом medium сидят по 2 low, а в high 3 medium)

вот и вопрос - как сделать чтобы сигналы шли от low в high и при этом мы знали что это low1 а это low6

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от panter_dsd

а как послать из черт знает откуда глобальное событие? и вообще из другого потока?

void QCoreApplication::postEvent ( QObject * receiver, QEvent * event ) [static]

тут есть receiver, а он не виден в нижних подклассах (low в моем примере выше)

пока не понял как эту проблему элегантно решить средствами Qt, но почему-то уверен что это реально, что есть там что-то... :)

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Это все равно еще не задача, это начало ее решения, но неважно.
В данном случае, я бы наверное забил на поиск Qt-решения и сделал бы через какой-нибудь observer паттерн.

rival ★★
()
Ответ на: комментарий от I-Love-Microsoft

тут есть receiver, а он не виден в нижних подклассах (low в моем примере выше)

То есть ты parent не назначаешь?
И где у тебя в том примере добавляются новые аргументы в сигнал?

rival ★★
()
Ответ на: комментарий от I-Love-Microsoft

это не код, это пример иерархии
хочу из low в high чтобы ходили - вот и вся задача

Я и не говорил, что это код. То есть задачи нет, есть только хотелка странного?

хочу из low в high чтобы ходили - вот и вся задача

Но зачем? И зачем именно сигналы? Почему нельзя вызывать какой-нибудь метод родителя, например?

а как послать из черт знает откуда глобальное событие?

Ты можешь отправить событие инстансу QApplication'а, и поставить глобальный эвент фильтр, но это тоже костыльно как-то.

rival ★★
()
Ответ на: комментарий от rival

Я и не говорил, что это код. То есть задачи нет, есть только хотелка странного?

не, стоит самая настоящая задача, при условии что у каждого low уже есть свой int id

тупо надо чтобы из низов пошло на high - это уже сделал путем эстафетной пересылки сигналов, а это лишние копирования - неужели не избежать???

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

как сделать чтобы сигналы шли от low в high и при этом мы знали что это low1 а это low6

sender() ?

Torvus
()
Ответ на: комментарий от I-Love-Microsoft

вот и вопрос - как сделать чтобы сигналы шли от low в high и при этом мы знали что это low1 а это low6

если без лишних вопросов, то так:

class low : public QObject
{
    Q_OBJECT // <--- muthafukka!!!
signals:
    void sig_new_data(QString name, QByteArray data);

public:
    void setName(QString);

private: 
    QString name_;
};

class medium : public QObject
{
    Q_OBJECT
private:
    low instance_of_low1;
    low instance_of_low2;
};

class high : public QObject
{
    Q_OBJECT
private:
    medium instance_of_medium1;
    medium instance_of_medium2;
    medium instance_of_medium3;
};

Надеюсь общая идея понятна?

shty ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

а вообще, структура и взаимоотношения классов неиллюзорно намекают на траблы в проектировании

shty ★★★★★
()
Ответ на: комментарий от shty

спасибо, тот пример выше - он ничего не объяснил и задачу не решил, мы не видим как из low сигнал попал в high

а представь себе что у тебя подклассы в потоках (low это QThread у меня) - в них обработка, которая блокирует текущий процесс (асинхронно никак) + некоторая тяжелая вычислительная работа

а далее идет некое логическое объединение в виде устройства и других подклассов для него помимо потоков - это medium

а в high эти устройства объединены логически + там TCP сервер - поэтому я хочу чтобы пакеты шли прямо наверх к серверу, у каждого low есть свой ID, так что не запутается

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от shty

ты намекаешь что через наследование надо? мне так не кажется и это не решит задачу о передаче снизу вверх - или решит? как

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

мы не видим как из low сигнал попал в high

а зачем это «видеть»???

представь себе что у тебя подклассы в потоках (low это QThread у меня)

QThread - это не поток, QThread - это класс для управления потоком

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

редставь себе что у тебя подклассы в потоках (low) - в них обработка, которая блокирует текущий процесс (асинхронно никак) + некоторая тяжелая вычислительная работа

я ничего не понял, как это если у тебя обработка в отдельных потоках она блокирует текущий, внезапно, процесс?

ты можешь описать задачу немного поточнее?

shty ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

ты намекаешь что через наследование надо?

нет

у тебя нарисованы красивые три уровня, но пока для меня они выглядят как «не пришей кобыле хвост» (но то может быть мой дефект зрения, не исключаю)

shty ★★★★★
()
Ответ на: комментарий от shty

это именно дефект зрения потому что такое логическое разделение задачи я уже объяснил в предпредыдущем посте

я не понимаю зачем вам подробности - все ясно как день

надо тупо передать из глубин подклассов сигнал

другие способы я знаю и уже применил

I-Love-Microsoft ★★★★★
() автор топика

Есть ли возможность передать это более элегантно и быстро?

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

no-such-file ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

это именно дефект зрения потому что такое логическое разделение задачи я уже объяснил в предпредыдущем посте

«не пришей кобыле хвост» - это именно что после Вашего объяснения

я не понимаю зачем вам подробности - все ясно как день

мне ничего не ясно, вообще

надо тупо передать из глубин подклассов сигнал

ну и какие тут проблемы? Вам ещё в первом посте сказали - цепляйте сигналы к сигналам и вперёд

shty ★★★★★
()
Ответ на: комментарий от shty

ну и какие тут проблемы? Вам ещё в первом посте сказали - цепляйте сигналы к сигналам и вперёд

сигналы к сигналам????? как??? пример кода в студию

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

сигналы к сигналам????? как??? пример кода в студию

class A : public QObject
{
    Q_OBJECT

signals:
    void signal_a();

public:
    A(QObject* parent = 0) : QObject(parent) { }
    void foo() { emit signal_a(); }
};


class B : public QObject
{
    Q_OBJECT

signals:
    void signal_b();

public:
    B(QObject* parent = 0) : QObject(parent) 
    {
         QObject::connect(&a, SIGNAL(signal_a()), SIGNAL(signal_b()));
    }

private:
    A a;
};
shty ★★★★★
()
Ответ на: комментарий от shty

все, проблема решена, я так и знал что упустил самое очевидное!

спасибо за пример кода, именно так теперь и делаю - сигнал к сигналу и понеслась - это и есть решение вопроса этого топика

I-Love-Microsoft ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.