为什么将 QImage 声明为静态常量会产生无效值?
Why declaring a QImage as static const produces an invalid value?
我有一个名为 ItemView
的 QGraphicsItem
对象,我正在为其创建许多实例,它们都在我的 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)
我有一个名为 ItemView
的 QGraphicsItem
对象,我正在为其创建许多实例,它们都在我的 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)