QT使应用程序检查是否有一个更新在sourceforge.net
QT make app to check if there is an update on sourceforge.net
我希望我的QT应用程序检查是否有一个更新在sourceforge.net。为此,我使用请求:https://sourceforge.net/projects/kidbasic/best_release.json如果你在浏览器中使用这个链接,你会得到一些json回复。这是代码:
app.pro
QT += core gui
QT += network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = app
TEMPLATE = app
SOURCES += main.cpp
mainwindow.cpp
HEADERS += mainwindow.h
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include <QPushButton>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void replyFinished(QNetworkReply* reply);
void checkForUpdate(void);
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QWidget * wdg = new QWidget(this);
QPushButton *train_button = new QPushButton(wdg);
train_button->setText(tr("check update"));
setCentralWidget(wdg);
QObject::connect(train_button, SIGNAL(released()), this, SLOT(checkForUpdate()));
}
MainWindow::~MainWindow(){ }
void MainWindow::checkForUpdate(void){
QNetworkRequest request;
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setProtocol(QSsl::SecureProtocols);
request.setSslConfiguration(config);
request.setUrl(QUrl("https://sourceforge.net/projects/kidbasic/best_release.json"));
//other urls to test
//request.setUrl(QUrl("https://sourceforge.net/projects/openofficeorg.mirror/files/stats/json?start_date=2014-10-29&end_date=2014-11-04"));
//request.setUrl(QUrl("https://ro.gravatar.com/205e460b479e2e5b48aec07710c08d50.json"));
//request.setUrl(QUrl("http://headers.jsontest.com/"));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
manager->get(request);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}
void MainWindow::replyFinished(QNetworkReply* reply){
qDebug() << reply->error();
if(reply->error() == QNetworkReply::NoError) {
//process json reply
QString strReply = (QString)reply->readAll();
qDebug() << strReply;
} else {
qDebug() << "ERROR";
}
reply->deleteLater();
}
(为了使它在没有警告的情况下工作,我从https://indy.fulgan.com/SSL/中取出libeay32.dll
和ssleay32.dll
,并将这些文件与我的应用程序放在同一文件夹中-因为https
)。
如果我尝试使用其他url,我得到了正确的回复。如果我使用任何surceforge.net
请求,我得到这个错误:QNetworkReply::NetworkError(RemoteHostClosedError)
.
我用https://www.hurl.it做同样的请求,一切似乎都很好。同样的结果我得到https://httpstatus.io/也。
我怎么能得到一个有效的答复从surceforge.net
与QT?
当HTTP请求的用户代理字符串为Mozilla/5.0
(这是QNetworkAccessManager
在没有设置QNetworkRequest::UserAgentHeader
时使用的默认用户代理)时,sourceforge.net
似乎正在关闭连接。
您可能必须在发送请求之前设置自定义用户代理:
request.setHeader(QNetworkRequest::UserAgentHeader, "App/1.0");
相关文章:
- 从C++本机插件更新Vector3数组
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- cmake更新缓存的变量
- 更新到莫哈韦后出现cmath错误
- OpenMP:并行更新数组总是需要减少数组吗
- 为什么我的变量没有更新,我的 LED 没有亮起?
- 指针没有更新它在void函数内部指向的值
- 如何在c++中获取要更新的值
- 已修改的LinkedList未在文本文件本身中更新
- Qt:当QListView获得新条目时,如何更新QStringList
- 更新的矢量元素不打印
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- 如何在ECS框架中更新组件数据和通知系统
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- 如果我想在没有更新编译器的情况下使用新功能,该怎么办?
- 如何在 C++11 中查找和更新向量中的一个嵌套结构
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 在 emscripten 网页汇编正在运行期间更新进度条?
- 在运行时使用范围更新结果
- QT使应用程序检查是否有一个更新在sourceforge.net