问题描述
我正在尝试编写一个带有自定义 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>
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。
我读过的所有内容,以及我之前编写的与此非常相似的类似代码,都告诉我这应该可以工作。为什么不呢?
解决方法
这里的问题是我正在尝试编写一个库。
我通过显式初始化资源解决了这个问题。
-
找到为资源生成的 CPP 文件。就我而言,它是 resources.cpp。
-
确定初始化和清理函数的名称。就我而言,它们是:
int qInitResources_configmgr();
int qCleanupResources_configmgr();
-
在合适的地方,例如在库主类的 CPP 文件中,在本地声明这两个函数。
-
在适当的地方调用这两个函数。例如。分别是主类的构造函数和析构函数。