为什么将 QImage 声明为静态常量会产生无效值?

Why declaring a QImage as static const produces an invalid value?

我有一个名为 ItemViewQGraphicsItem 对象,我正在为其创建许多实例,它们都在我的 QGraphicsView 上显示为 QImage

我通过为 ViewItem 的每个实例创建一个新的 QImage 来工作,但现在我试图将那个 属性 转换为静态字段以进行优化,因为我真的只需要一个,我就是无法让它工作。

作为测试,我在 QImage 旁边添加了一个 static const int,效果很好。

// .hh
class ViewItem : public QGraphicsItem
{
public:
    ...
private:
    static const QImage IMAGE;
    static const int TEST;
};

//.cc
const QImage ViewItem::IMAGE = QImage(":/data/data/img.png");
const int ViewItem::TEST = 30;

我的 QGraphicsItem::paint() 方法中的断点将 IMAGE 值显示为 (invalid),但 TEST 按预期显示 30

为什么它适用于 int 而不是 QImage

注意:对我来说这是一个 XY 问题。我将提供 X 问题的解决方案,我建议您考虑您的 Y 问题,并可能提出另一个明确针对它的问题。

原因

您使用 QImage 初始化 ViewItem::IMAGE,从 fileName 构建。根据 documentation:

If the loading of the image failed, this object is a null image.

加载失败,因为此时资源文件不可用,此时ViewItem::IMAGE被初始化

X 的解决方案

要获得预期结果,而不是资源图像,请使用磁盘中的图像,该图像位于构建文件夹的 data/data/ 子文件夹中:

const QImage ViewItem::IMAGE = QImage("data/data/img.png");

图像在初始化时就已经存在,所以构造函数会成功创建一个有效的 QImage。要对此进行测试,请调用:

qDebug() << TEST << IMAGE;

ViewItem的构造函数中。它会产生类似的结果:

30 QImage(QSize(256, 256),format=QImage::Format_ARGB32,depth=32,devicePixelRatio=1,bytesPerLine=1024,sizeInBytes=262144)