Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Heggi от Мая 22, 2015, 14:59



Название: connect сам на себя
Отправлено: Heggi от Мая 22, 2015, 14:59
Пишу обертку для работы с OwnCloud, отнаследовал QNetworkAccessManager. Теперь хочу перехватывать сигнал finished, чтобы логику разборки ответа оставить внутри класса. Для этого делаю коннект сигнала finished на слот finish.
Оно работает так даже, но ИМХО это какой-то костыльный метод. Может есть более правильный вариант перехватить сигнал finished внутри класса?

Код:
class OwnCloud : public QNetworkAccessManager
{
    Q_OBJECT
public:
    OwnCloud();
public slots:
    void finish(QNetworkReply *reply);
};

OwnCloud::OwnCloud(): QNetworkAccessManager()
{
    QObject::connect(this,SIGNAL(finished(QNetworkReply*)),this,SLOT(finish(QNetworkReply*)));
}


Название: Re: connect сам на себя
Отправлено: Swa от Мая 22, 2015, 15:20
Это не костыльный метод, это вполне нормальная обработка события. Не понимаю, что вас смущает. Подписывать свой слот на свой же сигнал - это не костыль.


Название: Re: connect сам на себя
Отправлено: Heggi от Мая 22, 2015, 15:23
Именно это и смущает, что приходится подписывать самого на себя.

Но раз это нормально, то ладно...


Название: Re: connect сам на себя
Отправлено: kambala от Мая 22, 2015, 15:41
если бы твой код пускал сигнал, тогда можно было бы вызвать метод напрямую, минуя сигналы-слоты. а так другого выхода нету.


Название: Re: connect сам на себя
Отправлено: Akon от Мая 29, 2015, 11:59
А нельзя ли QNetworkAccessManager сделать членом OwnCloud?


Название: Re: connect сам на себя
Отправлено: MaxoBik от Мая 31, 2015, 14:50
А нельзя ли QNetworkAccessManager сделать членом OwnCloud?

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


Название: Re: connect сам на себя
Отправлено: __Heaven__ от Июня 01, 2015, 11:13
Код
C++ (Qt)
QObject::connect(this,SIGNAL(finished(QNetworkReply*)),this,SLOT(finish(QNetworkReply*)));
Можно проще записать
Код
C++ (Qt)
connect(this,SIGNAL(finished(QNetworkReply*)),SLOT(finish(QNetworkReply*)));


Название: Re: connect сам на себя
Отправлено: Akon от Июня 01, 2015, 20:44
Цитировать
Что это принципиально изменит?
Во-первых, снимется комплекс подписывания на собственные сигналы, а во-вторых (главное), это более правильно с архитектурной точки зрения, т.к. от открытого наследования в данном случае появляется ненужный (или даже неконсистентный) интерфейс.