#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTextCodec>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
setWindowOpacity(1.0);
setAttribute(Qt::WA_TranslucentBackground);
//QString appDirPath = "";
#if defined(Q_OS_LINUX)
appDirPath = qApp->applicationDirPath() + "/";
#endif
connect(this, SIGNAL(urlFound(QString,QString)), this, SLOT(downloadFileFromUrl(QString,QString)));
// connect(this, SIGNAL(picSaved(QString)), &todaysPic, SLOT(preview(QString)));
}
MainWindow::~MainWindow()
{
delete ui;
}
/*
* Getting "http://cn.bing.com/"
* Turn to function "findPicUrl()" to read the reply when SIGNAL "finished" arrives.
*/
void MainWindow::getWholeWebSource()
{
QUrl url("https://bing.ioliu.cn/?p=1");
ui->textEdit->insertPlainText("打开网页.");
QNetworkRequest request;
request.setUrl(url);
connect(&manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(findPicUrl(QNetworkReply*)));
manager.get(request);//用finished信号传递reply
}
/*
* disconnect信号与槽
* 读取已完成的全部reply
* 搜索关键字符串,找到完整的目标url,即指向壁纸图片的url
* emit the SIGNAL: "urlFound", connected with the SLOT: "downloadPic"
*/
void MainWindow::findPicUrl(QNetworkReply *reply)
{
//心跳 时钟开始
disconnect(&manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(findPicUrl(QNetworkReply*)));
if(reply->error() == QNetworkReply::NoError)
{
QByteArray webContent = reply->readAll();
/*** 存到文件方便查找问题。
QFile file("测试文件.txt");//写成一个可阅读的txt文档,用于程序测试
file.open(QIODevice::ReadWrite);
file.write(webContent);
file.close();
***/
QByteArray targetUrl = "https://bing.com/th";
//QByteArray targetUrl = "/az/hprichbg/rb/";
int indexStart = -1;
indexStart = webContent.indexOf(targetUrl);
if(indexStart != -1)//若在获取到的网页源码中找到了所需url,则get之
{
//qDebug("找到了壁纸的url:");
/**
webContent = webContent.mid(indexStart);
indexEnd = webContent.indexOf("jpg");
indexEnd = indexEnd + 2;
QUrl url( webContent.left(indexEnd + 1));
qDebug()<<url;
**/
// 获取图片标题
QString str = QString(webContent);
QStringList titlenames,fileurl;
QRegExp exp("<h3>([^<]*)</h3>");
exp.setMinimal(false);
int pos = 0;
while ((pos = exp.indexIn(str , pos)) != -1)
{
pos += exp.matchedLength();
//qDebug() << "pos :" << pos;
//qDebug() << expurl.cap(0);
QString strtemp=exp.cap(0).replace("<h3>","");
//qDebug() << strtemp;
strtemp=strtemp.replace("</h3>","");
//ui->textEdit->append(strtemp);
titlenames.append(strtemp);
//QUrl url(pos);
}
// 获取图片路径
QRegExp expurl("https://bing.com/[^/][^;]+\._UHD.jpg&qlt=100");
expurl.setMinimal(false);
pos = 0;
while ((pos = expurl.indexIn(str , pos)) != -1)
{
pos += expurl.matchedLength();
//qDebug() << "pos :" << pos;
//qDebug() << expurl.cap(0);
//ui->textEdit->append(expurl.cap(0));
fileurl.append(expurl.cap(0));
}
int icount=fileurl.count();
for(int i = 0; i <1; i++)
{
if(lastFile==titlenames[i])
{
//退出。 lastFile=titlenames[0];
}
emit urlFound(fileurl[i],titlenames[i]);
}
}
else
{
//showStatusTips(URL_NOT_FOUND);
}
}
else
{
//showStatusTips(NETWORK_CONNECTION_FAILED, reply->errorString());
}
}
/*
strUrl:下载图片时需要的url
strFilePath:下载图片的位置(/home/XXX/YYY.png)
*/
void MainWindow::downloadFileFromUrl(QString strUrl, QString strFilePath)
{
//qDebug() << strUrl << " " << strFilePath;
QFile file;
filePath = QDir::homePath() + "/" + "Pictures/";
QDir dir;
dir.mkdir(filePath);
filePath =filePath+strFilePath+".jpg";
//qDebug() << "file:"<<filePath;
ui->textEdit->append(filePath); // 文件名称
file.setFileName(filePath);
QPixmap picture;
QByteArray byte = InitGetRequest(strUrl, "downImgFromUrl");
//qDebug()<<"数据大小:"<<byte.size();
ui->textEdit->append("文件大小:"+ QString::number(byte.size()/1024)+"K");
if(!picture.loadFromData(byte, "JPG"))
{
qDebug()<<"图片数据读取出错!";
//showStatusTips(LOAD_FROM_DATA_FAILED, QString("%1").arg(byte.size()));
return;
}
if(!picture.save(filePath))
{
ui->textEdit->append("图片保存失败!");
//qDebug()<<"图片保存失败!";
// ui->label_load->setText("保存图片失败!");
}
else
{
//qDebug()<<"图片保存成功!";
ui->textEdit->append("图片保存成功!");
lastFile=strFilePath; //保存完成文件提交准备保存。
}
ui->textEdit->show();
}
//get
QByteArray MainWindow::InitGetRequest(QString url, QString obj)
{
//循环拼接
ui->textEdit->append("开始:.");
QString baseUrl =url;
//qDebug() << baseUrl;
//构造请求
QNetworkRequest request;
request.setUrl(QUrl(baseUrl));
QNetworkAccessManager *manager = new QNetworkAccessManager();
// 发送请求
static int i = 0;//心跳计时器
QNetworkReply *pReplay = manager->get(request);
//开启一个局部的事件循环,等待响应结束,退出
QEventLoop eventLoop;
QObject::connect(pReplay,SIGNAL(finished()), &eventLoop, SLOT(quit()));
//add timeout deal
QTimer *tmpTimer = new QTimer();
tmpTimer->setInterval(40000);//40秒内没有下载完成,则自动挂断网络连接。
connect(tmpTimer,SIGNAL(timeout()),&eventLoop, SLOT(quit()));
//心跳 时钟开始
QTimer *didaTimer = new QTimer();
didaTimer->setInterval(200);//0.2秒一个心跳。
//心跳 时钟描述
connect(didaTimer,&QTimer::timeout,[=](){
i++;
ui->textEdit->insertPlainText(".");
ui->textEdit->show();
});
didaTimer->start();
tmpTimer->setSingleShot(true);
tmpTimer->start();
eventLoop.exec();
tmpTimer->stop();
//心跳 时钟结束
didaTimer->stop();
ui->textEdit->insertPlainText("用时:"+QString::number(i*0.2)+"秒");
i=0;//清除计时器。
ui->textEdit->show();
if (pReplay->error() == QNetworkReply::NoError)
{
//qInfo() << QString("request %1 正常!").arg(obj);
}
else
{
qWarning()<<QString("request %1 handle errors here").arg(obj);
QVariant statusCodeV = pReplay->attribute(QNetworkRequest::HttpStatusCodeAttribute);
//statusCodeV是HTTP服务器的相应码,reply->error()是Qt定义的错误码,可以参考QT的文档
qWarning()<<QString("request %1 found error ....code: %2 %3").arg(obj).arg(statusCodeV.toInt()).arg((int)pReplay->error());
qWarning(qPrintable(pReplay->errorString()));
}
//获取响应信息
QByteArray bytes = pReplay->readAll();
return bytes;
}
void MainWindow::on_pushButton_clicked()
{
QSettings settings(IniFilePath, QSettings::IniFormat); // 当前目录的INI文件
lastFile = settings.value("lastFile").toString(); //获取上次的打开路径