MyPaper Icon
Lovely  cat : MyPaper App's Icon

Elias:此项目的诞生是出于对 Pap.er app 的喜爱。当前公开版本仅能读取本地壁纸,临时替代 升级 macOS 26后,因崩溃而无法使用的 Pap.er 。

 

1. 缘起

矫情的自己,遇到了“矫情”的 Pap.er

大致是 1 7年的夏天,发现了一个叫做  Pap.er 的应用。当时相较其他壁纸 App ,走极简风的 Paper  略显“矫情”。这恰好对了正在特立独行,矫情的自己的胃口。这一相看,便是 9 年。 直至……去年 ( 25 年) 9月,电脑升级 macOS 26 之后,一直闪退,给开发者 发送邮件  也如石沉大海。

2. “又一次的缘分”

pap.er官网留言 其实,在看到越来越多的留言(估计是从 app store 同步过来的评论)提到闪退无法解决的评论也越来越多。随着时间的流逝,对作者“弃坑”可能性的猜测也越来越强烈。在邮件发出的两个月后,午后,在又一次的知乎摸鱼之旅中,刷到了一篇关于 QT ant design 组件的文章。鬼使神差地,一个冲动从心而生:与其等着作者修复,还有其弃坑的风险,何不抄一个自己用? 于是,在一番简单的权衡后,选择了 Cpp + QT + Qml 的组合。为什么不选 electron、rn 之类的, 纯粹觉得js恶心  自然地,在花费 1 天多(接近两天) 学习 cpp 语法和 STL 后,粗略了解了一下 QT 和 QML之后; 就在 Trae  + ChatGPT + Claude + ChatGLM + Google 的协助下完成了对 Pap.er “复刻”。

在此,感谢 Bo QianC++ Standard Library 课程 (虽然有些错误),让我对STL有了个“整体”的了解。相关代码: STL-LEARNING

 

3. 说说 MyPaper

3.1 已有功能

之前也提到:MyPaper 的出现仅仅是因为 Pap.er 无法在 macOS 上运行。由于 Pap.er 使用多年,屯下的壁纸甚多。起初只是想写个 python 脚本和定时任务,实现定时随机更换壁纸即可,但想着平时 windows 和 macOS 的使用频率相近,为何不好好做个“看起来” 不错的 UI 呢? 毕竟,简洁好看,是当初选择它的第一原因。 如果只是脚本或者丑陋的 cmd窗口程序, 分享给好友使用时,还要教的话,那岂非浪费生命?于是, 它有了大致轮廓。 当前已完成功能:

  1. 与 Pap.er 大体相近的外观和交互形式:一个简单的列表,以及 常驻 system tray 或 status bar;
  2. 列表出现位置根据 windows/macOS 自动计算; 比如 windows 出现在右下角(托盘位置), macOS 出现在右上角(不考虑任务栏被拖动到其他位置的情况)
  3. 列表读取并展示壁纸,设置壁纸;
  4. 自定义壁纸文件夹;
  5. 壁纸历史列表,保存之前设置过的壁纸,方便回味;
  6. 定时更换壁纸;
  7. 设置持久化:使用QSettings,  当前, Windows中通过注册表保存设置;macOS 通过 plist 保存配置。

 

3.2 ToDos:

ToDos:

  1. 服务器端:实现壁纸爬虫,配合Agent爬取并筛选合格的壁纸(其实最好是人工手动筛选,保证壁纸质量),这也是 Pap.er 等“小清新”壁纸软件很重要的竞争力来源;
  2. 客户端定时更新最新壁纸,将 hotest 标签页的壁纸读取逻辑修改为从服务器端读取;
  3. 优化壁纸列表加载逻辑,通过 thumbnails(低质量)/原图(高质量)  图片配合提高加载速度;
  4. 项目代码架构优化,当前代码大部分由 AI 完成,说实话,质量堪忧不错;
  5. 如果决定持续迭代,尝试构建 CI/CD Pipeline 。

当前已有的功能已经基本上可以让 MyPaper 成为一个合格的“临时替代”并 “跑起来” 。因此,这里的 ToDos 其实已是可有可无,但这些功能完成,可以赋予它灵魂和生命力(其实就是不想花钱搞服务器,也不想白嫖一些服务,以及一点点私心)。再静待数月,如果 bug 还未修复,再考虑启动 ToDos 的计划。 如果有专业的程序员出手,优化一下,那更是荣幸之至。

4. 尝试用下 MyPaper

mypaper github addr
MyPaper github repositort

使用它可以自行编译或者直接下载使用;目前仓库是私密状态,待完善readme后会开放。

4.1 自行编译:

Windows:

安装 QT:   项目使用的是QT 6.10.1 (windows: MingW13.1.0, macOS: gcc), 因在 macOS 中使用低于 6 的 QT 会不可避免在编译时自动添加 AGL,一个macOS已经弃用的动态连接库,导致编译失败。不是不能解决,但为什么要浪费时间呢?前往官网下载QT安装完成后,应该能够在开始菜单中找到。

 

使用QT自带的终端(不是cmd! 不是cmd! 不是cmd!),使用这个终端 ,QT会自动链接需要的动态库。

以下操作在 QT 自带的终端中完成

切换到D盘:

如果你的硬盘未分区,则使用命令 【C:】切换到C盘根目录。完成后,打开 C 盘(或 D 盘)就可以方便找到。

拉取仓库:

 git clone https://github.com/craii/MyPaper.git cd MyPaper 

如此完成后,会在 D 盘 中看到一个 MyPaper  文件夹,其中包含本项目代码和资源。

 

配置 release 版本

 cmake -S . -B build-release -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release 

-G "MinGW Makefiles" 这部分可以不写,但写了更稳妥

 

编译 release 版本

 cmake --build build-release 
编译成功后,生成的程序在这里  MyPaper \build-release\wallpaper.exe 。

 

但注意,这时候的 wallpaper.exe 只能在自己的电脑中运行,因为运行必须的 QT链接库都没有带。如果让它能够在其他电脑中运行,需要将 wallpaper.exe  和 必要的库一起打包。

 

打包 Portable 版本

还是在 同一个 Qt MinGW 命令行里:

 cd build-release windeployqt wallpaper.exe 

执行后 build-release文件夹的结构目录大概是:

 wallpaper.exe Qt6Core.dll Qt6Gui.dll Qt6Qml.dll Qt6Quick.dll platforms/ qml/ imageformats/ 

 

最后一步

MyPaper 文件夹中的 app_icon.ico 、 app_icon.png 拷贝到 build-release 文件夹中。 此时,如果要分享,把build-release整个文件夹拷走就行了。


MacOS:

以下命令在终端(terminal)中执行即可:

检查QT版本: 安装 QT cmake 后,检查QT的版本 ,版本号应该是 6.10.1 或更高:

 

如果你之前安装过 anaconda 或者 pyside6/pyqt等,上述命令的运行结果可能是 5.xx.x ,此时,需要额外执行命令:

然后在某个合适的空白行中 cmd + v 粘贴上

 export PATH=/Users/eliascheung/Qt/6.10.1/macos/bin:$PATH 

注意,eliascheung 修改成你的用户名,6.10.1 修改成你安装的版本。如果你不知道这些,并且你安装 QT 时是一路下一步的。那么你可以:

打开finder --> 按下cmd + shift +g --> 在弹窗中输入 ~ -->回车 然后再列表中找到 QT,进入 QT 文件夹,找到数字版本,进入,点macos, 找到bin文件夹 然后鼠标点击空白位置后,键盘 按下 option + cmd + c; 粘贴到记事本中,然后用站贴的内容替换 export PATH=/Users/eliascheung/Qt/6.10.1/macos/bin:$PATH 中的  /Users/eliascheung/Qt/6.10.1/macos/bin 这部分。

然后,按下 esc键, 接着

 

最后

此时,如果再运行

其输出结果应该是与你下载的版本一致了。

 

拉取仓库: 首先,我们切换到 documents 文件夹,这样方便我们在finder中找到它

然后拉取仓库:
 git clone https://github.com/craii/MyPaper.git cd MyPaper 

如此完成后,会在 ~/documents/ 中看到一个 MyPaper  文件夹,其中包含本项目代码和资源。

创建 release 文件夹

 rm -rf build-macos-release mkdir build-macos-release cd build-macos-release 

配置 release 版本

cmake .. \
 -DCMAKE_BUILD_TYPE=Release \ 
DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" \ 
-DCMAKE_OSX_DEPLOYMENT_TARGET=10.15

编译 release 版本

 cmake --build . --config Release 

 

打包 wallpaper.app 版本

 macdeployqt wallpaper.app -qmldir=.. 

 

APP临时签名,确保有足够的权限: 因为在 photobackend.cpp 中:

  1. 切换壁纸功能是通过终端执行 AppleScript 实现的,
  2. 读取/保存壁纸等需要访问磁盘

这些都需要需要权限。qt自动签名可能会导致无法获取这些权限,从而无法实现切换壁纸。

 codesign --force --deep --sign - YourAppName.app 

最后

保持热爱,永远好奇

App整合包和Github:

Windows/MacOS 下载 【提取码:kj5g】: Download Github: https://github.com/craii/MyPaper