我正在尝试部署一个 Qt6 应用程序,它捆绑了自己的图标(这样在 Windows/OSX 上我可以获得一致的图标)。作为构建的一部分,我将微风图标的内容部署到 $BIN/share/icons 中(我有一个 CMake 函数可以为我完成此操作)。
理论上,我应该这样做:
QStringList paths;
paths << QIcon::fallbackSearchPaths()
<< QDir(QCoreApplication::applicationDirPath() + "/../share/icons").absolutePath();
qDebug() << "Icons search path" << paths;
QIcon::setFallbackSearchPaths(paths);
QIcon::setThemeName("Breeze");
然后在我的代码中:
newFilePopup->setIcon(QIcon::fromTheme("document-new"));
这对我不起作用。由于某些原因,图标未加载。
我的构建结构看起来不错(在
../share/icons/
中我有一个带有图标索引的子目录,并且在我的代码中我正确地使用了它)。
$ ~/src/program/build/ ls -l bin/program share/icons/breeze/*.theme
-rwxrwxr-x 1 user user 12783136 Jul 25 18:42 bin/program
-rw-rw-r-- 1 user user 19288 Jul 5 13:52 share/icons/breeze/index.theme
我没有找到有关此设置的文档,而且我不知道如何调试它。在内部代码使用内部的
QThemeIconEngine(name))
。尝试查看代码 - qt/qtbase/src/gui/image/qiconloader.cpp - 但发现没有明显的调试方法。
编辑: 我想知道这是否与 AppImage 和平台集成有关。
当我“正常”运行应用程序时,我可以看到图标(即使我删除了系统图标)。但是,当我将其打包为 AppImage 时 - 我看不到图标。
我已根据需要修改了标题。
我面临的问题是,在创建AppImage期间,图标插件没有打包。
我将这些行添加到我的构建脚本中:
mkdir -p "dist/${matrix_config_build_dir}/usr/plugins/iconengines/"
mkdir -p "dist/${matrix_config_build_dir}/usr/plugins/platforms/"
cp -arv $QTDIR/plugins/iconengines/* "dist/${matrix_config_build_dir}/usr/plugins/iconengines/"
cp -arv $QTDIR/plugins/platforms/libqwayland-*.so "dist/${matrix_config_build_dir}/usr/plugins/platforms/"
我是怎么发现这一点的?我跑./program.AppImage --appimage-mount
。这将显示我的 AppImage 的安装点。然后我
cd
进入它,并从顶部运行
./AppRun
我的应用程序现在运行,我仍然看到问题(我可以重现)。然后我运行
strace -o 1.txt ./AppRun
并评估打开的文件。我看到该程序尝试打开 iconengines 目录 - 该目录在 squashfs 上不可用。这意味着 Qt AppImage 插件没有复制它。那不好玩。