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
Цитировать
Что это принципиально изменит?
Во-первых, снимется комплекс подписывания на собственные сигналы, а во-вторых (главное), это более правильно с архитектурной точки зрения, т.к. от открытого наследования в данном случае появляется ненужный (или даже неконсистентный) интерфейс.