QPixmap 无法使用资源加载

QPixmap fails to load using resource

我正在尝试编写一个带有自定义 Qt icon-text 标签类型 object 的库。然而,尽管显示了小部件,但该图标从未显示(通过用纯文本替换像素图进行测试)。

我的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,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,
  ...
  0x44,0xae,0x42,0x60,0x82,
  
};

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

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

};

...

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

我的classheader:

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;

};

我的class构造函数:

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, 0, 0);
    setLayout(layout);
}

我也试过在 QPixmap 实例上调用 load() 并且它 returns 错误。

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

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

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

  1. 找到为资源生成的 CPP 文件。在我的例子中是 resources.cpp.

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

    int qInitResources_configmgr();

    int qCleanupResources_configmgr();

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

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