Слоты в кастомном классе



  • Привет всем. Недавно столкнулся с проблемой, хотел написать класс загрузчика, но единственной проблемой оказалась привязка сигналов QNetworkReply к кастомному классу ( CDownloader ) который наследован от QObject (иначе не коннектится вообще)

    @
    //эта ф-я в классе CDownloader

    QNetworkReply *reply = manager.get(QNetworkRequest(QUrl(address)));

    reply->connect(reply, SIGNAL(finished()),this, SLOT(getReplyFinished()));
    reply->connect(reply, SIGNAL(readyRead()), this, SLOT(readyReadReply()));
    @

    Вот объявление класса:
    @
    class CDownLoader : public QObject
    {
    public:
    CDownLoader(QObject *parent);
    void GetBuffer(QString );

    private:
    QNetworkAccessManager manager;
    QNetworkReply *reply;

    public slots:
    void getReplyFinished();
    void readyReadReply();
    };
    @

    Но я получаю ошибку во время выполнения программы:
    Object::connect: No such slot QObject::getReplyFinished()
    Object::connect: No such slot QObject::readyReadReply()

    А если не наследовать CDownloader от QObject то не коннектится вообще(ошибка компиляции):
    @
    ошибка: no matching function for call to 'QNetworkReply::connect(QNetworkReply*&, const char [12], CDownLoader* const, const char [20])'
    @



  • Решено!
    Не буду плохим парнем и скажу решение:

    привёл коннекты к такому виду:
    @
    reply->connect(reply, SIGNAL(finished()),(QObject*)this, SLOT(getReplyFinished()));
    reply->connect(reply, SIGNAL(readyRead()), (QObject*)this, SLOT(readyReadReply()));
    @

    т.е добавил каст к QObject для this.

    Сам класс привёл к такому виду:
    @
    class CDownLoader : public QObject
    {

    Q_OBJECT
    

    public:
    CDownLoader(QObject *parent);
    void GetBuffer(QString );

    private:
    QObject *parent;
    QNetworkAccessManager manager;
    QNetworkReply *reply;

    public slots:
    void getReplyFinished();
    void readyReadReply();
    };
    @



  • Добавлять каст как раз было не обязательно, главное, чтобы у обоих соединяемых объектов в объявлении их классов было Q_OBJECT в первой строке (это метка для qmake, которая "включает" механизм сигналов и слотов)



  • Еще, наверное, через перегрузку для произвольного функтора можно соединить.
    Я так "лямбда-выражения" на сигналы вешал.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.