У меня проблема с сигналом и слотами, когда я вызываю функцию 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();
};
Ваш "менеджер" объекта уничтожается сразу после завершения функции test(). Чтобы избежать этого, попробуйте динамически создать объект:
httpManager *manager;
void test()
{
manager = new httpManager();
manager->sendRequest("http://google.com/");
}
Обратите внимание, что "httpManager * manager" находится вне любой функции.
Теперь ваш объект "manager" находится где-то в памяти (называется кучей) и не уничтожается при выходе из функции test(). Остерегайтесь, этот метод не так хорош, потому что "менеджер" теперь является глобальной переменной, что не очень хорошо в объектно-ориентированном программировании, но в первый раз это не имеет значения.
Проблема с первым кодом заключается в том, что объект "менеджер", который имеет тип "httpManager", создается в стеке после вызова функции "test()" и соответственно уничтожается, когда test() возвращается. Поэтому нет объекта "manager", когда "test()" возвращается, а сигналы и слоты не будут работать. Хотя в последнем коде "менеджер" существует до тех пор, пока приложение не будет прекращено.