Russian Qt Forum

Qt => Общие вопросы => Тема начата: alexis031182 от Март 09, 2010, 19:25



Название: Как получить список подключенных объектов
Отправлено: alexis031182 от Март 09, 2010, 19:25
Имеется объект, которому нужна информация о подключенных к нему методом QObject::connect() других объектах. Просто хотя бы список получить. QObject::connectNotify() и QObject::receivers() не подходят, т.к. первый метод не передаёт информации о самом объекте, а второй лишь возвращает общее количество подключенных объектов.


Название: Re: Как получить список подключенных объектов
Отправлено: SABROG от Март 09, 2010, 20:53
Стандартными средствами никак.


Название: Re: Как получить список подключенных объектов
Отправлено: alexis031182 от Март 09, 2010, 21:57
Если нестандартно, то только при помощи хранения списка указателей на объекты подключенных классов? Других вариантов нет?


Название: Re: Как получить список подключенных объектов
Отправлено: SASA от Март 10, 2010, 14:57
Можно в отладчике по шагам посмотреть, что происходит при "испускании" сигнала и как он доходит до слушающих. Мне кажется внутри QObject есть место где хранится эта информация. Может как-нибудь можно до неё добраться :)


Название: Re: Как получить список подключенных объектов
Отправлено: SABROG от Март 10, 2010, 15:20
Можно, добирались, но это хак.


Название: Re: Как получить список подключенных объектов
Отправлено: alexis031182 от Март 10, 2010, 15:50
Спасибо за участие. Решил задачу через сигнальную петлю.


Название: Re: Как получить список подключенных объектов
Отправлено: Akaiten от Март 10, 2010, 16:08
Есть ещё один, несколько "хакерский" способ. Через использование Q_DECLARE_PRIVATE. Пример:
Код
C++ (Qt)
#include "qobject_p.h"
 
class MyObject : public QObject
{
Q_OBJECT
 
public:
MyObject(QObject *parent = 0);
~MyObject();
 
inline QObjectList senderList() const
{ return d_func()->senderList(); }
inline QObjectList receiverList(const char *signal) const
{ return d_func()->receiverList(signal); }
 
private:
Q_DECLARE_PRIVATE(QObject)
};
 
Также см. исходники QAccessibleWidget.


Название: Re: Как получить список подключенных объектов
Отправлено: alexis031182 от Март 10, 2010, 16:34
О! Спасибо! Этот способ куда как лучше моего :)


Название: Re: Как получить список подключенных объектов
Отправлено: SABROG от Март 10, 2010, 17:03
Раз уж хак все-таки тут разместили, то еще один способ "доступа".

Код
C++ (Qt)
#include "qobject_p.h"
 
class MyObject : public QObject
{
Q_OBJECT
 
public:
MyObject(QObject *parent = 0);
~MyObject();
 
inline QObjectList senderList() const
{ return d_ptr->senderList(); }
inline QObjectList receiverList(const char *signal) const
{ return d_ptr->receiverList(signal); }
 
private:
using QObject::d_ptr;
};
 

Также см. исходники QAccessibleWidget.

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