feat: 用 logo.png 作为程序图标并补齐打包资源

- 从 logo.png 生成 packaging/ 下的 ico / icns / 256px png
- Qt 运行时窗口图标走 resources.qrc(不安装也有图标),
  并以 setDesktopFileName 声明桌面文件名
- Linux 增加 voiletmark.desktop 与 make install 规则
  (可执行文件 + desktop 条目 + hicolor 图标)
- Windows 用 RC_ICONS 嵌入 exe 图标,macOS 用 ICON 设置 app bundle 图标
- 关于对话框显示 logo
- 版本 0.3.1
This commit is contained in:
2026-10-22 17:31:57 +08:00
parent dd9c79446e
commit caa65b9c97
8 changed files with 73 additions and 8 deletions
+27 -1
View File
@@ -103,6 +103,28 @@ make -j"$(nproc)"
脚本会依次查找 `command -v qmake`、`$QT_PREFIX/bin/qmake`、
`$HOME/Qt5/5.15.2/gcc_64/bin/qmake`;也可以用 `QMAKE=/path/to/qmake` 直接指定。
## 安装(Linux)
```bash
make -C build install # 默认装到 /usr/local
make -C build install INSTALL_ROOT=/tmp/pkg # 打包用,装到 /tmp/pkg/usr/local
```
会一起装上可执行文件、`voiletmark.desktop` 和 256×256 图标,
装完就能在应用菜单里搜到 VoiletMark。
## 图标
`logo.png` 是源文件,`packaging/` 里是从它生成的各平台图标:
| 文件 | 平台 |
| --- | --- |
| `voiletmark.ico` | Windows 可执行文件图标(`RC_ICONS`) |
| `voiletmark.icns` | macOS 应用包图标(`ICON`) |
| `voiletmark.png` | Linux 桌面图标(hicolor 256×256) |
运行时的窗口图标直接嵌在资源里(`resources.qrc`),所以不安装也有图标。
## 命令行
```bash
@@ -137,7 +159,11 @@ src/
├── ThemeManager.{h,cpp} 四种主题模式 + 系统检测 + 调色板 / QSS 生成
├── MainWindow.{h,cpp} 菜单、文件读写、文件夹侧栏、状态栏、设置
├── MarkdownEditor.{h,cpp} 编辑器控件:行号、缩进、标题 / 代码块命令、源码模式
└── MarkdownHighlighter.{h,cpp} Markdown 语法着色(含围栏代码块状态机)
└── MarkdownHighlighter.{h,cpp} Markdown 着色与就地渲染(隐藏标记、标题缩放)
logo.png 图标源文件
resources.qrc 窗口图标资源
packaging/ 各平台图标(ico / icns / png)与 .desktop
```
## 下一版计划
+15 -1
View File
@@ -1,6 +1,6 @@
TEMPLATE = app
TARGET = VoiletMark
VERSION = 0.3.0
VERSION = 0.3.1
QT += core gui widgets
@@ -13,6 +13,10 @@ INCLUDEPATH += $$PWD/src
RESOURCES += resources.qrc
# 各平台的可执行文件图标
win32: RC_ICONS = packaging/voiletmark.ico
macx: ICON = packaging/voiletmark.icns
SOURCES += \
src/main.cpp \
src/MainWindow.cpp \
@@ -25,3 +29,13 @@ HEADERS += \
src/MarkdownEditor.h \
src/MarkdownHighlighter.h \
src/ThemeManager.h
# Linux 桌面集成:make install 之后能在应用菜单里找到
isEmpty(PREFIX): PREFIX = /usr/local
target.path = $$PREFIX/bin
desktop.files = packaging/voiletmark.desktop
desktop.path = $$PREFIX/share/applications
icon.files = packaging/voiletmark.png
icon.path = $$PREFIX/share/icons/hicolor/256x256/apps
INSTALLS += target desktop icon
+17
View File
@@ -0,0 +1,17 @@
[Desktop Entry]
Type=Application
Version=1.0
Name=VoiletMark
GenericName=Markdown Editor
GenericName[zh_CN]=Markdown 编辑器
Comment=Lightweight cross-platform Markdown editor
Comment[zh_CN]=轻量的跨平台 Markdown 编辑器
Exec=VoiletMark %F
Icon=voiletmark
Terminal=false
Categories=Utility;TextEditor;Office;
Keywords=markdown;editor;notes;
Keywords[zh_CN]=markdown;编辑器;笔记;
MimeType=text/markdown;
StartupNotify=true
StartupWMClass=VoiletMark
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

+13 -6
View File
@@ -20,6 +20,7 @@
#include <QMenu>
#include <QMenuBar>
#include <QMessageBox>
#include <QPixmap>
#include <QSaveFile>
#include <QSettings>
#include <QSignalBlocker>
@@ -653,12 +654,18 @@ void MainWindow::applyThemeMode(int mode)
void MainWindow::showAbout()
{
QMessageBox::about(
this, tr("关于 VoiletMark"),
tr("<h3>VoiletMark %1</h3>"
"<p>一个轻量的跨平台 Markdown 编辑器。</p>"
"<p>基于 Qt %2 与 C++17 构建,界面会跟随系统自动切换浅色 / 深色主题。</p>")
.arg(QCoreApplication::applicationVersion(), QString::fromLatin1(qVersion())));
QMessageBox box(this);
box.setWindowTitle(tr("关于 VoiletMark"));
box.setIconPixmap(QPixmap(QStringLiteral(":/logo.png"))
.scaled(72, 72, Qt::KeepAspectRatio, Qt::SmoothTransformation));
box.setTextFormat(Qt::RichText);
box.setText(tr("<h3>VoiletMark %1</h3>"
"<p>一个轻量的跨平台 Markdown 编辑器。</p>"
"<p>基于 Qt %2 与 C++17 构建。</p>")
.arg(QCoreApplication::applicationVersion(),
QString::fromLatin1(qVersion())));
box.setStandardButtons(QMessageBox::Ok);
box.exec();
}
void MainWindow::addRecentFile(const QString &path)
+1
View File
@@ -17,6 +17,7 @@ int main(int argc, char *argv[])
QApplication app(argc, argv);
QApplication::setStyle(QStyleFactory::create(QStringLiteral("Fusion")));
QApplication::setWindowIcon(QIcon(QStringLiteral(":/logo.png")));
QGuiApplication::setDesktopFileName(QStringLiteral("voiletmark"));
QCoreApplication::setOrganizationName(QStringLiteral("VoiletMark"));
QCoreApplication::setApplicationName(QStringLiteral("VoiletMark"));