Windows

1
2
3
4
5
6
7
8
9
10
11
#include <windows.h>

void WallPaper::setWallPaper(QString filePath)
{
const char *tmp = filePath.toStdString().c_str();
std::wstringstream wss;
wss << tmp;
const wchar_t *filename = wss.str().c_str();
if( !SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (void*)filename, SPIF_UPDATEINIFILE) )//调用windows的API函数
qDebug("设置桌面背景失败!");
}

注: win10可调用此函数实现其功能。但win7会将桌面背景变成纯黑色

Ubuntu

鉴于Ubuntu的相关API函数使用难度较大,需要安装一些库,过程太过繁琐。这里介绍一种比较简单的实现方法,即Qt的C++与SHELL结合使用来实现此功能:

  1. 在本project的目录下,单独存了一个SHELL文件。该SHELL中主要包含了一个图片路径变量和设置Ubuntu桌面背景的相关指令。
  2. 使用QFile设置更改SHELL文件中当前的图片路径。
  3. 使用QProcess执行此SHELL文件,更换壁纸。注:该SHELL文件的右键属性权限中应设置为“允许作为程序执行文件”。

Qt程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <QProcess>
void WallPaper::setWallPaper(QString filePath)
{
//更改SHELL文件“setwallpaperforUbuntu”中的图片路径信息
QFile file(qApp->applicationDirPath() + "/setwallpaperforUbuntu");
file.open(QIODevice::ReadWrite);
QTextStream textStream(&file);
QString text = textStream.readAll();
int start = text.indexOf("/home");
textStream.seek(start);
textStream << filePath << "' ";//这么多空格是因为每次路径字符串长度不等,保证能够覆盖。SHELL文件相应位置也有空格(empty spaces)
file.close();

//调用执行该SHELL文件
QProcess *setWallPaperSHELL = new QProcess;
QString command = qApp->applicationDirPath() + "/setwallpaperforUbuntu";
setWallPaperSHELL->start(command);
}

Shell文件 setwallpaperforubuntu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

# Set picture options
# Valid options are: none,wallpaper,centered,scaled,stretched,zoom,span ned
picOpts="zoom"

# File Path, the location where the Bing pics are stored, NOTICE: there are many empty spaces after the ".jpg'", which is very necessary!
filePath='/home/yinhe/Pictures/WaldkauzDE_ZH-CN10024135858_1920x1080.jpg'

# Set the GNOME3 wallpaper
DISPLAY=:0 GSETTINGS_BACKEND=dconf gsettings set org.gnome.desktop.background picture-uri '"file://'$filePath'"'

# Set the GNOME 3 wallpaper picture options
DISPLAY=:0 GSETTINGS_BACKEND=dconf gsettings set org.gnome.desktop.background picture-options $picOpts

# Exit the script
exit

参考来源: https://www.jianshu.com/p/7b069405fe8a