- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的第一个 Qt 应用程序正在开发中。它是用于站点消息传递的桌面客户端。
Qt 文档说我只需要一个 QNetworkAccessManager 跨应用程序实例。但我也读到在 Qt 中使用单例不是一个好主意。我如何在应用程序中创建一个 QNetworkAccessManager 实例?
另一个问题是当我从其他类调用 ApiHandler 函数时如何正确连接插槽?
例如我有 ExampleApi 类,它使用 ApiHandler 的函数,在 updateMessageList 槽 messagesListUpdated 应该被连接请求完成后更新 View 中的消息列表,但它从未调用过。
ExampleApi.h
...
#include "apihandler.h"
class ExampleApi : public QObject
{
Q_OBJECT
public:
explicit ExampleApi(QObject *parent = 0);
void updateMessagesList();
signals:
public slots:
void messagesListUpdated(QNetworkReply* reply);
};
ExampleApi.cpp
ExampleApi::ExampleApi(QObject *parent) :
QObject(parent)
{
}
void ExampleApi::updateMessagesList()
{
QMap<QString, QString> m;
m["user_id"] = ConfigParser::settings.value(USER_ID).toString();
QNetworkAccessManager nam;
ApiHandler a(&nam);
// Connect a slot
connect(a.getManager(), SIGNAL(finished(QNetworkReply*)), this, SLOT(messagesListUpdated(QNetworkReply*)));
a.makeRequest("messages.get", m);
}
void ExampleApi::messagesListUpdated(QNetworkReply* reply)
{
QJsonDocument j = QJsonDocument::fromJson(reply->readAll());
QJsonObject getjson = j.object();
qDebug() << "ExampleApi::messagesListUpdated()" << getjson;
reply->deleteLater();
// ...
}
ApiHandler.h
class ApiHandler : public QObject
{
Q_OBJECT
public:
explicit ApiHandler(QNetworkAccessManager *nam, QObject *parent = 0);
~ApiHandler();
QNetworkReply* makeRequest(QString method, QMap<QString, QString> parameters);
QNetworkAccessManager* getManager();
private:
QUrl buildCall(QString method, QMap<QString, QString> parameters);
QNetworkAccessManager* manager;
signals:
public slots:
void replyFinished(QNetworkReply* reply);
void slotReadyRead();
void slotError(QNetworkReply::NetworkError error);
void slotSslErrors(QList<QSslError> errorList);
};
ApiHandler.cpp
#include "apihandler.h"
ApiHandler::ApiHandler(QNetworkAccessManager *nam, QObject *parent) :
QObject(parent), manager(nam)
{
Q_ASSERT(manager);
}
ApiHandler::~ApiHandler()
{
manager->deleteLater();
}
QUrl ApiHandler::buildCall(QString method, QMap<QString, QString> parameters)
{
QUrl url = QUrl(API_URL + method);
QUrlQuery query;
ConfigParser c;
// Append first access_token
query.addQueryItem("access_token", c.settings.value(ACCESS_TOKEN_KEY).toString());
if (!parameters.isEmpty()) {
QMapIterator<QString, QString> i(parameters);
while (i.hasNext()) {
i.next();
query.addQueryItem(i.key(), i.value());
}
}
url.setQuery(query.query());
return url;
}
QNetworkReply* ApiHandler::makeRequest(QString method, QMap<QString, QString> parameters)
{
QUrl url = this->buildCall(method, parameters);
//qDebug() << "ApiHandler::makeRequest: " << url;
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
QNetworkRequest request;
request.setUrl(url);
request.setRawHeader("User-Agent", "Site-Client");
QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(slotSslErrors(QList<QSslError>)));
return reply;
}
void ApiHandler::replyFinished(QNetworkReply* reply)
{
qDebug() << "ApiHandler::replyFinished:" << reply->url();
QJsonDocument j = QJsonDocument::fromJson(reply->readAll());
if (j.isEmpty()) {
// throw error
qDebug("ApiHandler::replyFinished(...) j.isEmpty :(");
} else {
qDebug() << "ApiHandler::replyFinished(...)" << j;
}
reply->deleteLater();
}
void ApiHandler::slotReadyRead()
{
//qDebug("slotReadyRead");
}
void ApiHandler::slotError(QNetworkReply::NetworkError error)
{
qWarning() << "raised error:" << error;
}
void ApiHandler::slotSslErrors(QList<QSslError> errorList)
{
qWarning() << "raised sslErrors" << errorList;
}
QNetworkAccessManager* ApiHandler::getManager()
{
return this->manager;
}
最佳答案
QNetworkAccessManager 片段的一个实例
QNetworkAccessManager* getManager() {
static QNetworkAccessManager* nam = new QNetworkAccessManager;
return nam;
}
关于c++ - QNetworkAccessManager 一个实例和连接槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46056808/
这是我的文件。我对此有一些疑问。 // networking.h #ifndef NETWORKING_H #define NETWORKING_H #include class Networ
我是 Qt 新手,我试图了解以下信号槽连接: m_networkManager = new QNetworkAccessManager(this); QNetworkReply *reply = m_
我尝试对 REST 服务执行简单的 GET 操作,并想知道如何识别/关联请求与我在 SLOT 函数中获得的响应。例如,我可能会向同一经理发送多个请求,并希望传递一个 messageID,以便在我的 S
我有一个非常困惑的问题。 我有一个简单的项目,它从一些 ftp 服务器下载文件。效果非常好。 然后,我尝试将相同的代码实现到一个更大的项目中(第一个是控制台应用程序,第二个是 GUI,但我认为这不会改
我正在尝试在 CentOS 6.4 上的 Qt 5.0 中使用 QNetworkAccessManager 将文件上传到服务器。 我曾尝试在网上遵循一些示例,但它们都不起作用。 QFTP 工作得很好,
目前我正在开发一个从远程服务器发送和接收文件的应用程序。为了进行网络操作,我正在使用 QNetworkAccessManager。 要上传文件,我使用 QNetworkAccessManager::p
函数 CheckSite() 使用类似 http://example.com 的 URL 调用,它初始化一个 QNetworkAccessManager 对象和 connect() 插槽和信号。 ma
在 qt4.8 中,仍然有 qhttp 类,我可以使用 http->hasPendingRequests()检查是否还有待处理的请求。 但是在qt5中,我们被迫使用QNetworkAccessMana
QNetworkAccessManager 工作得很好,然后每次在 get() 方法上都开始崩溃,这非常简单: QNetworkReply *reply = myManager->get(QNetwo
我有一个从 QObject 派生的类“下载器”,它在工作线程中运行。当线程启动时,下载器在堆上创建一个 QNetworkAccessManager 对象,并开始请求文件。我会跟踪请求和接收了多少文件。
所以我有这段代码: QUrl url("http://..."); QNetworkRequest request(url); QNetworkReply *reply = m_networkMana
我的第一个 Qt 应用程序正在开发中。它是用于站点消息传递的桌面客户端。 Qt 文档说我只需要一个 QNetworkAccessManager 跨应用程序实例。但我也读到在 Qt 中使用单例不是一个好
我想直接请求和响应,而不是使用 connect(..,SLOT(finished()),..,SLOT()) 最佳答案 您可以使用QEventLoop,以便应用程序等待并可以同时处理其他事件。 #in
我在另一个线程中创建了一个 QNetworkAccessManager。该网络只能在 MyMegaThread 中使用。 QNetworkAccessManager 是从线程的 run 方法创建的:
我正在尝试使用以下代码下载网页的源代码头文件: #include #include #include #include #include class CDownloader : public
我有以下代码: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我正在使用 Qt 4.7.4 中的 QtNetwork 为 VLC 2.0 编写一个 HTTP 访问模块。我的代码片段如下: static int Open(vlc_object_t *p_this)
在我的应用程序中,我有一个将文件上传到服务器的方法,这个方法工作正常。 但是,当我一次多次调用此方法时(例如遍历 chooseFilesDialog 的结果),前 7 个(或多或少)文件已正确上传,其
QString My_class::My_Method() { QNetworkAccessManager *manager= new QNetworkAccessManager(this);
我是一名优秀的程序员,十分优秀!