QPixmap 无法使用资源加载

问题描述

我正在尝试编写一个带有自定义 Qt 图标文本标签类型对象的库。然而,尽管显示了小部件,但图标永远不会显示(通过用纯文本替换像素图进行测试)。

我的 CMakeLists.txt:

...
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/resources.cpp
    COMMAND rcc -no-compress ${CMAKE_CURRENT_SOURCE_DIR}/src/qt/configmgr.qrc -name configmgr -o ${CMAKE_CURRENT_BINARY_DIR}/resources.cpp
    DEPENDS src/qt/configmgr.qrc src/qt/info.png
)
...
add_library(ConfigMgr STATIC
    ...
    src/qt/section_header.cpp
    ${CMAKE_CURRENT_BINARY_DIR}/resources.cpp
)
...

我的 configmgr.qrc:

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
    <file>info.png</file>
</qresource>
</RCC>

这会生成一个“resources.cpp”,看起来像这样:

static const unsigned char qt_resource_data[] = {
  0x0,0x0,0x1,0x76,0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0x49,0x48,0x44,0x52,...
  0x44,0xae,0x42,0x60,0x82,};

static const unsigned char qt_resource_name[] = {
  // info.png
  0x0,0x8,0x4,0xd2,0x59,0x69,0x6e,0x66,0x6f,0x2e,0x70,0x67,};

static const unsigned char qt_resource_struct[] = {
  // :
  0x0,0x2,// :/info.png
  0x0,0x78,0x7d,0xe0,0x40,0x12,};

...

构建输出包括 resources.cpp.o,它应该链接到库中。

我的班级标题

class SectionHeader : public QWidget
{
    Q_OBJECT

    public:
        SectionHeader(const std::string &text,const std::string &info);
        virtual ~SectionHeader();

    private:
        std::string  m_info;
        Qpixmap      m_icon;

};

我的类构造函数

SectionHeader::SectionHeader(const std::string &text,const std::string &info)
             : m_info{info},m_icon(":/info.png")
{
    QHBoxLayout *layout = new QHBoxLayout;
    QLabel      *label;

    if (!m_info.empty()) {
        label = new QLabel;
        label->setpixmap(m_icon);
        layout->addWidget(label);
    }

    label = new QLabel(text.c_str());
    label->setAlignment(Qt::AlignCenter);
    label->setStyleSheet("font-weight: bold; font-family: Calibre; font-size: 10pt");
    layout->addWidget(label);

    layout->setContentsMargins(0,0);
    setLayout(layout);
}

我还尝试在 Qpixmap 实例上调用 load(),但它返回 false。

我读过的所有内容,以及我之前编写的与此非常相似的类似代码,都告诉我这应该可以工作。为什么不呢?

解决方法

这里的问题是我正在尝试编写一个库

我通过显式初始化资源解决了这个问题。

  1. 找到为资源生成的 CPP 文件。就我而言,它是 resources.cpp。

  2. 确定初始化和清理函数的名称。就我而言,它们是:

    int qInitResources_configmgr();

    int qCleanupResources_configmgr();

  3. 在合适的地方,例如在库主类的 CPP 文件中,在本地声明这两个函数。

  4. 在适当的地方调用这两个函数。例如。分别是主类的构造函数和析构函数。