当前位置: 首页 > Linux

Qt官方示例-入门-http下载小工具

时间:2023-04-07 03:09:38 Linux

大家好,我是老吴。最近又在玩Qt,给大家分享一些Qt的基础知识。我个人非常喜欢Qt,简直就是我C++残党的一把利器。学习Qt最好的方法应该是看官方的手册和例子。今天要分享的是Qt官方提供的一个例子。http下载小工具:点击查看大图源码文件:`Makefile``httpwindow.cpp``main.cpp``httpwindow.h``http.pro`下面快速讲解一下这个小工具的实现方法,我们走吧.:`1。实现主界面``2。解析URL并创建一个空文件``3。发送http请求和接收http数据``4。添加进度条``5.下载完成后自动打开文件``1.实现主要界面的主要界面是基于QDialog的,包括:3LineEdit;1个复选框;1个标签;2个按钮;代码如下:`httpwindow.h``classHttpWindow:publicQDialog``{``...``}````````httpwindow.cpp``HttpWindow::HttpWindow(QWidget*parent)``:QDialog(parent)``...``{``QFormLayout*formLayout=newQFormLayout;``formLayout->addRow(tr("&URL:"),urlLineEdit);``formLayout->addRow(tr("&Downloaddirectory:"),downloadDirectoryLineEdit);``formLayout->addRow(tr("Default&file:"),defaultFileLineEdit);``formLayout->addRow(launchCheckBox);``QVBoxLayout*mainLayout=newQVBoxLayout(this);``mainLayout->addLayout(formLayout);``mainLayout->addWidget(statusLabel);``QPushButton*quitButton=newQPushButton(tr("Quit"));``QWidget::close);``QDialogBu??ttonBox*按钮框=newQDialogBu??ttonBox;``buttonBox->addButton(downloadButton,QDialogBu??ttonBox::ActionRole);``buttonBox->addButton(quitButton,QDialogBu??ttonBox::RejectRole);``mainLayout->addWidget(buttonBox);``}`withQFormLayout3个编辑框的窗体布局,然后使用QVBoxLayout进行整体垂直布局main.cpp:`intmain(intargc,char*argv[])``{``...``HttpWindowhttpWin;``httpWin.show();``...``}`运行效果:此时只有界面,下载按钮没有实际作用。2.解析URL并创建一个空文件当用户点击Download按钮时,需要解析用户输入的URL,并打开一个新的文件来保存要下载的文件。代码如下:1.绑定下载按钮`connect(downloadButton,&QAbstractButton::clicked,this,&HttpWindow::downloadFile);``}`2.解析URL`voidHttpWindow::downloadFile()``{``//获取URL``constQStringurlSpec=urlLineEdit->text().trimmed();``constQUrlnewUrl=QUrl::fromUserInput(urlSpec);``//获取文件保存路径``QString文件名=newUrl.fileName();``QStringdownloadDirectory=QDir::cleanPath(downloadDirectoryLineEdit->text().trimmed());``fileName.prepend(downloadDirectory+'/');``}`从URL中提取文件名,和下载路径拼接在一起,形成一个完整的文件路径。3.创建一个空文件`voidHttpWindow::downloadFile()``{``...``if(QFile::exists(fileName)){``QFile::remove((fileName));``}``file=openFileForWrite(fileName);``...``}``std::unique_ptrHttpWindow::openFileForWrite(constQString&fileName)``{``std::unique_ptrfile(newQFile(fileName));``file->open(QIODevice::WriteOnly);``returnfile;``}`运行效果:3.发送http请求,接收http数据=============================在Qt中,可以使用QNetworkAccessManager发送http请求,使用QNetworkReply保存http回复。`classHttpWindow:publicQDialog``{``private:``...``QUrlurl;``QNetworkAccessManagerqnam;``QNetworkReply*reply;``};`当用户按下下载按钮时,发送http请求:`voidHttpWindow::startRequest(constQUrl&requestedUrl)``{``url=requestedUrl;``reply=qnam.get(QNetworkRequest(url));``connect(reply,&QIODevice::readyRead,this,&HttpWindow::httpReadyRead);``connect(reply,&QNetworkReply::finished,this,&HttpWindow::httpFinished);``statusLabel->setText(tr("Downloading%1...").arg(url.toString()));``}`当数据到达时,将其写入文件:`voidHttpWindow::httpReadyRead()``{``if(file)``file->write(reply->readAll());``}`当数据传输完成后,提示用户下载:`voidHttpWindow::httpFinished()``{``QFileInfofi;``if(file){``fi.setFile(file->fileName());``file->close();``file.reset();``}``statusLabel->setText(tr("已将%1字节下载到%2\n\n%3")``.arg(fi.size()).arg(fi.fileName(),QDir::toNativeSeparators(fi.absolutePath())));``downloadButton->setEnabled(true);``}`运行效果:4.添加进度条=============发送请求后,创建进度条进度条百分比为绑定到http回复的数据设置在一起:`voidHttpWindow::startRequest(constQUrl&requestedUrl)``{``...``ProgressDialog*progressDialog=newProgressDialog(url,nullptr);``...``connect(reply,&QNetworkReply::downloadProgress,progressDialog,&ProgressDialog::networkReplyProgress);``...``progressDialog->show();``}``//更新进度条的百分比``voidProgressDialog::networkReplyProgress(qint64bytesRead,qint64totalBytes)``{``setMaximum(totalBytes);``setValue(bytesRead);``}`运行效果:5.下载完成后自动打开文件===================QDesktopServices用于访问常用的桌面服务。许多桌面环境提供一组服务,允许应用程序执行常见任务。例如,在用户的应用程序首选项中打开网页或PDF。下载完成后,如果用户启用启动文件选项,则打开下载的文件:`voidHttpWindow::httpFinished()``{``...``if(launchCheckBox->isChecked()){``QDesktopServices::openUrl(QUrl::fromLocalFile(fi.absoluteFilePath()));``}``downloadButton->setEnabled(true);``}`运行效果:至此,这个http下载widget就完成了。嘿,你学会了吗?相关参考https://doc.qt.io/qt-5/qtnetw...思考技术,思考生活,需要学习技术,学习如何生活。好书推荐:《指数基金投资指南》作者BankScrew,专注于低估值指数基金投资,系统讲解各种指数基金,以及投资指数基金的有效策略。单击以查看大图可以获得什么?复习了一些有关定期投资基金的基础知识;你和我各有一个苹果,如果我们交换苹果,我们仍然只有一个苹果。但是当你我各自有一个想法,我们交换想法时,我们都有两个想法。如果您觉得文章对您有价值,不妨阅读+分享。推荐阅读:特别|Linux驱动开发专刊|一点C每天特价|Linux系统编程

最新推荐
猜你喜欢