我一直在使用this example为我的Qt诺基亚应用程序创建一个http请求,但我似乎无法让它工作。
起初我尝试了QHttp,但它已被弃用。
这是结构:
mainwindow.cpp
mainwindow.h
request.cpp
request.h
以下是代码:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
Request* request = new Request();
}
MainWindow::~MainWindow()
{
delete ui;
}
#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”的用途是什么?
#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”插槽和“finishedSlot”插槽都设置了断点,但没有任何反应。
任何人都知道我可能做错了什么?
答案 0 :(得分:3)
以下是Q_OBJECT
宏的解释:
除其他外,
Q_OBJECT宏必须出现在 类定义的私有部分 声明自己的信号和 槽...
所以我首先尝试取消注释,看看有什么变化。它应该至少让你的信号和插槽相互通信。 (这是一个特定于Qt的功能,不是C ++的一部分,需要Q_OBJECT
宏。)我没有仔细查看其余的代码,因为这是首先要尝试的事情。实际上,我很惊讶它甚至可以在没有它的情况下进行编译。
答案 1 :(得分:0)
我取消注释了Q_OBJECT,并得到了一些vtable错误或类似的东西。今天早些时候,当我在那里有Q_OBJECT时,我确实得到了这个错误信息,这就是我评论它的原因。
但是因为我是Qt的新手,所以我忘了在request.h中输入QObject “#include”
这为我解决了一切:)
感谢Dave的阐述和阐述。