Windows中.ico图标未显示

10

我按照Qt资源系统指南进行操作,.ico图标在Linux上显示出来了。

但是当我尝试从Qt Creator运行应用程序时,在Windows上无法显示这些图标。

根据Qt/C++:在Windows下运行程序时图标不显示,我怀疑可能是插件问题,但是我在创建Qt插件的指南中找不到解决方法。

是否是插件问题?为什么在Windows上图标没有显示出来呢?

如果是插件问题:我该如何告诉我的应用程序在哪里找到qico.dll呢?


环境详细信息:

工作环境:Kubuntu 12.04 LTS,Qt Creator 2.4.1和Qt 4.7.4(64位)

故障环境:Windows XP SP2 32位,Qt Creator 2.4.1和Qt 4.7.4(32位)

所有设置均为默认(开箱即用),我没有更改任何设置。

resources.qrc

<!DOCTYPE RCC><RCC version="1.0">
    <qresource>
        <file>images/spreadsheet.ico</file>
    </qresource>
</RCC>

也尝试了使用 <qresource prefix="/">

来自 applicaton.pro 文件。

RESOURCES += \
    resources.qrc

OTHER_FILES += \
    images/spreadsheet.ico

在相应的源文件

QIcon(":/images/spreadsheet.ico")

我也按照 在Windows上部署应用程序 中所述尝试过。

QDir plugins(QCoreApplication::applicationDirPath()+"/plugins");

qDebug() << "Plugin directory" << plugins.absolutePath() << "found?" << plugins.exists();

app.addLibraryPath(plugins.absolutePath());

在插件目录中使用qico.dll。程序会打印插件目录已存在,但图标仍未显示。

我再重复一遍:它在Linux上可以运行。


1
@Ali 这非常重要。因为如果 QIcon 不支持 ico 格式,那么你就有了答案。你应该使用 QImageReader::supportedImageFormats() 函数列出支持的格式,并查看你的 Windows 机器上是否有 ico - mip
如果没有找到,您可以将Qt的“plugin”目录中的“imageformats”目录复制到应用程序文件夹(可执行文件所在的位置)。然后它应该可以工作了。 - mip
@doc 好的,我会尝试。但是,如果 Microsoft 的 .ico 格式在 Linux 上受支持而在 Windows 上不受支持,那将非常非常奇怪。 - Ali
2
@Ali 首先尝试列出格式。您确定插件位于正确的路径中吗?imageformats 应该在应用程序文件夹中(因此,如果您的应用程序位于 c:\myapp 中,则应该有 c:\myapp\imageformats 文件夹而不是 c:\myapp\plugins\imageformats),您不需要设置任何内容。还要确保 qico4.dllqicod4.dll(如果您以调试模式构建)存在。 - mip
1
@doc 请将这次讨论撰写成文章,供以后的Google访问者参考,我愿意将其接受为答案。 - Ali
显示剩余9条评论
2个回答

19

对于未来的Google访客:您可以在问题下面阅读评论,因为这是答案诞生的地方。

所以问题在于默认情况下QIcon不支持ico格式,需要使用插件。在这种情况下,QImageReader::supportedImageFormats()函数可列出 QIcon 支持的格式,可以提供帮助。

如果您的格式没有受到支持,可以尝试将Qt的plugins目录中的imageformats文件夹复制到可执行文件所在的目录中。如果您的应用程序位于c:\myapp文件夹中,则应该有c:\myapp\imageformats文件夹(而不是c:\myapp\plugins\imageformats)。否则,您必须使用QCoreApplication::addLibraryPath设置路径。

还要确保qico4.dllqicod4.dll(如果您是在调试模式下构建)存在。


0

关于QCoreApplication::addLibraryPath的详细说明:

您需要使"plugins"文件夹可用。而不是子文件夹!

这里有一种方法供Python/PySide用户使用PySide包位置。如果您已经有一个QtGui.QApplication实例,即app,您也可以直接使用它:

pyside_plugin_path = os.path.join(sys.modules['PySide'].__path__[0], 'plugins')
app.addLibraryPath(pyside_plugin_path)

已经感谢doc!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接