【问题标题】:QPixmap fails to load using resourceQPixmap 无法使用资源加载
【发布时间】:2021-03-29 12:32:10
【问题描述】:

我正在尝试编写一个包含自定义 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,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,应该链接到库中。

我的班级标题:

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

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

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

【问题讨论】:

  • mmm 可能你放错了路径m_icon(":/info.png")configmgr.qrc 中没有prefix = "/"
  • 试试 m_icon(":info.png") 也许可行)

标签: qt qt5 qpixmap


【解决方案1】:

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

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

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

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

    int qInitResources_configmgr();

    int qCleanupResources_configmgr();

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-30
    • 2015-10-26
    • 2014-03-26
    • 2019-07-13
    • 2017-05-02
    • 2017-12-11
    • 1970-01-01
    相关资源
    最近更新 更多