Слоты сигналов Qt не вызываются

0

У меня проблема с сигналом и слотами, когда я вызываю функцию test() из основной функции, сигнал и слоты не работают (они не вызывают), но когда я вызываю код из test() непосредственно в main функция, сигнал и слоты вызывают! Что я делаю неправильно? Второй вопрос, есть ли способ вернуть ответ? Мне нужно найти что-то на странице.

main.cpp

void test()
{
    httpManager manager;
    manager.sendRequest("http://google.com/");
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MfzBot w;
    w.show();
    test();

    return a.exec();
}

рабочий main.cpp:

void test()
{
    httpManager manager;
    manager.sendRequest("http://google.com/");
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MfzBot w;
    w.show();

    httpManager manager;
    manager.sendRequest("http://google.com/");

    return a.exec();
}

httpmanager.cpp:

httpManager::httpManager()
{
    QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),
               this, SLOT(replyFinished(QNetworkReply*)));
}

QNetworkCookieJar cookies;

void httpManager::sendRequest(const char* url)
{
    QNetworkProxyFactory::setUseSystemConfiguration (true);

    QByteArray outArray;
    QDataStream stream(&outArray, QIODevice::WriteOnly);

    manager->setCookieJar(cookies);

    QNetworkRequest request(QUrl(url));

    manager->post(request, outArray);
}

void httpManager::replyFinished(QNetworkReply *reply)
{
    qDebug() << "ok! ";
    qDebug() << reply->readAll();
}

httpmanager.h:

class httpManager : public QObject
{
    Q_OBJECT

public:
    httpManager();

protected slots:
    void replyFinished(QNetworkReply *reply);

public:
    void sendRequest(const char *url);

private:
    QNetworkCookieJar *cookies = new QNetworkCookieJar();
    QNetworkAccessManager *manager = new QNetworkAccessManager();
};
  • 0
    Что вы подразумеваете под "есть ли способ вернуть ответ" ?? Так как в вашем слоте replyFinished указатель ответа является ответом. Также вы можете перейти к этому: stackoverflow.com/questions/1053099/…
  • 0
    Не забудьте обработать ошибки.
Теги:
qt
qt5
signals-slots
qnetworkaccessmanager

2 ответа

1
Лучший ответ

Ваш "менеджер" объекта уничтожается сразу после завершения функции test(). Чтобы избежать этого, попробуйте динамически создать объект:

httpManager *manager;

void test()
{
    manager = new httpManager();
    manager->sendRequest("http://google.com/");
}

Обратите внимание, что "httpManager * manager" находится вне любой функции.

Теперь ваш объект "manager" находится где-то в памяти (называется кучей) и не уничтожается при выходе из функции test(). Остерегайтесь, этот метод не так хорош, потому что "менеджер" теперь является глобальной переменной, что не очень хорошо в объектно-ориентированном программировании, но в первый раз это не имеет значения.

2

Проблема с первым кодом заключается в том, что объект "менеджер", который имеет тип "httpManager", создается в стеке после вызова функции "test()" и соответственно уничтожается, когда test() возвращается. Поэтому нет объекта "manager", когда "test()" возвращается, а сигналы и слоты не будут работать. Хотя в последнем коде "менеджер" существует до тех пор, пока приложение не будет прекращено.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню