Qt: Попытка сделать httprequest, но, похоже, не работает.Что случилось? - PullRequest
1 голос
/ 02 марта 2011

Я использовал этот пример для создания http-запроса для моего приложения Qt Nokia, но, похоже, я не могу заставить его работать.

Сначала я попробовал QHttp,но это устарело.

Вот структура:

mainwindow.cpp
mainwindow.h

request.cpp
request.h

Вот код:

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    Request* request = new Request();
}

MainWindow::~MainWindow()
{
    delete ui;
}

Request.h

#ifndef REQUEST_H
#define REQUEST_H

#include <QNetworkAccessManager>
#include <QUrl>
#include <QNetworkReply>
#include <QNetworkRequest>

class Request : QObject
{
    //Q_OBJECT
    public:
        Request();
    public slots:
        void finishedSlot(QNetworkReply* reply);
        void checkConnection(QNetworkReply* reply);

};

#endif // REQUEST_H

И кстати ... для чего используется "Q_OBJECT"?

Request.cpp

#include "request.h"
#include <QDebug>
#include <QMessageBox>

Request::Request()
{
  QNetworkAccessManager* oNetworkAccessManager = new QNetworkAccessManager(this);
  QObject::connect(oNetworkAccessManager, SIGNAL(finished(QNetworkReply*)),this,SLOT(finishedSlot(QNetworkReply*)));
  QObject::connect(oNetworkAccessManager, SIGNAL(networkSessionConnected()),this,SLOT(checkConnection(QNetworkReply*)));

  QUrl url("http://www.redrock.no");
  QNetworkReply* reply = oNetworkAccessManager->get(QNetworkRequest(url));

}

void Request::checkConnection(QNetworkReply* reply)
{
    QMessageBox msgBox;
    msgBox.setText("checkConnection");
    msgBox.setInformativeText("The network session has started");
    msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Save);
    int ret = msgBox.exec();
}

void Request::finishedSlot(QNetworkReply* reply)
{

    QMessageBox msgBox;
    msgBox.setText("checkConnection");
    msgBox.setInformativeText("The request is done");
    msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Save);
    int ret = msgBox.exec();
}

Окна сообщений только потому, что я неУ меня есть USB-кабель для моего телефона.

Я установил точки останова как в слоте checkConnection, так и в слоте Finishlot, но там ничего не происходит.

Кто-нибудь понял, что яможет быть не так?

Ответы [ 2 ]

3 голосов
/ 02 марта 2011

Вот объяснение макроса Q_OBJECT:

Среди прочего,

Макрос Q_OBJECT должен появиться в приватный раздел определения класса который объявляет свои собственные сигналы и Слоты ...

Так что я сначала попробую раскомментировать это и посмотреть, что изменится. По крайней мере, ваши сигналы и слоты должны общаться друг с другом. (Это специфичная для Qt особенность, не являющаяся частью C ++, и для нее требуется макрос Q_OBJECT.) Я не внимательно изучил остальную часть вашего кода, потому что это очевидное первое, что нужно попробовать. На самом деле, я удивлен, что он даже скомпилируется без этого.

0 голосов
/ 02 марта 2011

хорошо, наконец-то я нашел, что не так ... и, как обычно, это всего лишь небольшая ошибка от меня.

Я раскомментировал Q_OBJECT и получил ошибку vtable или что-то в этом роде. Я получил это сообщение об ошибке ранее сегодня, когда у меня там был Q_OBJECT, и именно поэтому я комментировал его.

Но так как я новичок в Qt, я забыл включить QObject в request.h "#include"

И это все исправило для меня:)

Спасибо за разъяснения и уточнения Дейв.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...