花了两个多星期,业余时间开发了这款软件。软件是wallhaven.cc站点的桌面版。类似的软件也有。比如:Wonderwall Wallpaper Manager (在微软应用商店里就可以搜到)。wallhaven(github 上可以搜到源码)。这两款软件使用起来都比较复杂,当然功能也比较多,搜索也更灵活。由于时间和个人精力原因,软件写的比较简单,不过能搜的图片都能搜到,不能搜的也能搜(支持apikey搜索)。
软件界面:
主界面功能:搜索框输入关键词,排序是可以根据添加日期、相关性、随机、收藏次数、浏览次数、排行榜进行排序。选中忽略动漫图片可以过滤掉关键词为anime的图片。输入apikey可以获搜索NSFW类型的图片。输入API KEY的结果:
可以看到输入api key获取的图片为45695页,没有apikey获取的为35009页。多出来的内容是什么自己(LSP)体会。
下载功能:
支持单个图片下载:主界面点击图片就可以下载,下载文件与DesktopPaper.exe同一目录下的download目录下。
批量下载:支持同页图片批量下载功能。该功能支持一次性下载一页(24个)图片的功能。
其他功能:
其他功能就不解释了,见名知意。
部分源码:
QLabel通过鼠标移动和移除事件添加tooltip,以及点击下载图片:
class ImgLabel:public QLabel{
Q_OBJECT
public:
ImgLabel(QWidget *parent,const QPixmap &pixMap):QLabel(parent){
this->setPixmap(pixMap);
}
~ImgLabel(){
}
protected:
void mouseReleaseEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
};
void ImgLabel::mouseMoveEvent(QMouseEvent *event) {
QToolTip::showText(mapToGlobal(rect().topLeft()), "点击下载:"+ this->property("id").toString() + "." + this->property("url").toString().split(".").last());
this->setCursor(Qt::PointingHandCursor);
//this->setStyleSheet("color: red;");
}
void ImgLabel::mouseReleaseEvent(QMouseEvent *event) {
QToolTip::hideText();
this->setCursor(Qt::ArrowCursor);
//this->setStyleSheet("color: #ecf0f1;");
}
void ImgLabel::mousePressEvent(QMouseEvent *event){
ImgDownThread *thread = new ImgDownThread(this->parent(),this->property("id").toString(),this->property("url").toString());
QObject::connect(thread, &ImgDownThread::finished, this->parent(), [thread](){
thread->deleteLater();
});
QToolTip::showText(mapToGlobal(rect().topLeft()),"下载已创建");
thread->start();
}
由于图片下载时要实现异步。使用QThread实现多线程下载。下载功能没有使用QNetworkAccessManager。而是使用的命令行工具aria2c.exe。aria2c.exe可以作为资源文件添加到Qt的资源文件(.qrc)中。使用时拷贝到工作目录,使用QProcess调用。
实现如下:
void ImgDownThread::run(){
QProcess process;
QFile executableFile(":/exe/aria2c.exe");
QDir exeFilePath ("./aria2c.exe");
if(!exeFilePath.exists()){
executableFile.copy("./aria2c.exe");
}
QString type = url.split(".").last();
process.setProgram("./aria2c.exe");
process.setArguments({"-o",QString("./download/").append(this->id).append(".").append(type),this->url});
process.start();
process.waitForFinished();
}
如果使用QNetworkAccessManager下载使用如下代码:
QNetworkAccessManager *netManager = new QNetworkAccessManager(this);
QNetworkRequest request;
request.setUrl(QUrl("http://xxx/xxx/xxx.png")); // 设置下载地址
QSslConfiguration sslConfig = request.sslConfiguration();
sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone); // 不进行ssl认证,https请求可能需要使用
request.setSslConfiguration(sslConfig);
QNetworkReply *reply = this->netManager->get(request); // 发送http或https请求
// 绑定请求完成的槽
QObject::connect(reply, &QNetworkReply::finished, [=](){
auto data = reply->readAll();
QFile file("./download/" + 文件名);
if(file.open(QIODevice::WriteOnly)){ // 以wirteonly方式打开
file.write(data); // 写入数据到文件
file.close();
}
}
使用QNetworkAccessManager的代码需要适当修改使用。
下载地址:
百度网盘: walhaven-paper.zip_免费高速下载|百度网盘-分享无限制 (baidu.com)
提取码:c4c1
后续会添加更多功能使程序更完善,如果还有后续的话。