首页 > 解决方案 > 为什么将 QImage 声明为静态常量会产生无效值?

问题描述

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

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

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

// .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)但 TEST30按预期显示。

为什么它有效int但无效QImage

标签: c++qtstaticconstantsqimage

解决方案


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

原因

ViewItem::IMAGE您使用由 aQImage构造的 a 进行初始化fileName。根据文档

如果图像加载失败,则此对象为空图像。

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)


推荐阅读