- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这样的陈述:
Qt3DRender::QAttribute *attribute = // ...
const float *posBufferPtr =
reinterpret_cast<const float *>(attribute->buffer()->data().constData());
一般来说,指针posBufferPtr
是:
但是,有时指针值会变得奇怪:
我想知道<QArrayData::shared_null+24>
是什么意思?我在问这个,因为当指针值很奇怪时,我的应用程序就会变得一团糟。
我通过确保我的缓冲区包含数据来修复错误:
Qt3DRender::QGeometryRenderer *mesh = // ...
Qt3DRender::QGeometry *meshGeometry = mesh->geometry();
for (Qt3DRender::QAttribute *attribute : meshGeometry->attributes()) {
Qt3DRender::QBuffer *buf = attribute->buffer();
if (buf) {
// If buffer is empty, use data-generator to make data available
if (buf->data().isEmpty())
buf->setData(buf->dataGenerator()->operator()());
buf->setSyncData(true);
buf->setAccessType(Qt3DRender::QBuffer::AccessType::ReadWrite);
}
}
最佳答案
查看文件 $QTDIR/qtbase/src/corelib/tools/qarraydata.h ,我们看到了:
struct Q_CORE_EXPORT QArrayData
{
[...]
static const QArrayData shared_null[2];
static QArrayData *sharedNull() Q_DECL_NOTHROW { return const_cast<QArrayData*>(shared_null); }
}
...所以我们看到 QArrayData::shared_null
是一个静态/单例 QArrayData
对象(实际上它是其中两个的数组)。大概它被用作哨兵对象;即当另一个数据结构如 Qt3DRender::QBuffer没有可指向的有效 QArrayData
对象,而是指向 shared_null
,作为表明该事实的一种方式。使用单例而不是 nullptr
在某些情况下很有用,因为这意味着他们的代码不必使用 if (buffer() != NULL)
来保护每个取消引用以避免在没有可用的有效 QArrayData
对象时崩溃。
至于 +24
部分,它表示您的指针距离 QArrayData::shared_null
对象开始的内存位置 24 字节。通过查看 qarraydata.h
中的代码,似乎 constData()
方法通过添加 qptrdiff
偏移值来计算要返回的指针指向它的 this
指针;所以大概在这种情况下偏移值设置为 24。但是,我认为返回的精确指针可能并不重要,因为 QArrayData::shared_null
对象在任何情况下都不太可能包含任何可用数据,即 data()
返回的长度可能为 0,因此不应取消引用指针。
我的建议是,在尝试使用 posBufferPtr
指针之前,您应该调用 attribute->buffer()->data().size()
并验证作为健全性检查,它足够大,可以用来做你想用它做的事情。即,如果您尝试将缓冲区用作 float
的数组,请使用 if (attribute->buffer()->data(). size() >= sizeof(float)*num_floats_I_expect_to_be_there)
或类似的。
关于c++ - 访问Qt3DRender::QBuffer的数据时数据指针为<QArrayData::shared_null+24>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57310099/
我正在编写一个 PyQt5 应用程序,但我认为这个问题对于 PySide2 和 Qt 也有效。我正在尝试将声音数据(sinuosids)写入缓冲区,然后在无缝循环中播放。但是,当我到达缓冲区末尾并返回
嗨,我认为 QMovie 可以采用 QBuffer 吗?这是我的代码。 a = QByteArray(img) b = QBuffer(a) self.movie = QMovie(b, 'GIF')
我正在编写一个 Qt (4.6) 应用程序,负责从 usb acm 调制解调器设备读取数据。从设备中读取原始二进制和 (ascii) 字符数据的混合。我有一个线程负责在数据可用时不断地将数据从设备读取
我正在尝试通过QTextStream 重复写入/读取QBuffer 对象。首先我构造两个对象: QBuffer b; b.open(QIODevice::ReadWrite); QTextStream
我正在做这样的事情: QImage image(width, height, QImage::Format_RGB32); frame.fill(QColor(255, 255, 255).rgb()
我正在寻找在 C++ Qt5.6 中从 void * data 和 long data_size 创建 QBuffer 的最简单和优雅的方法。 我尝试将 void 转换为 char 指针并使用 QBy
我在 RAM 中有一个 QBuffer ,其中包含一个临时 wav 文件,我想让用户从任意位置收听它,想听多少次就听多少次。但是,它只允许播放一次,不允许重播。如果我播放文件 (QUrl.fromLo
我的目标是创建一个 numpy 数组并将其字节数据转换为 QBuffer。我想知道如何正确设置 DataSize、ByteStride 和 Count。请参阅下面的代码: self.mesh = Qt
使用我现在拥有的代码,我可以成功地播放文件中的 .mp3 数据。但是我需要使用 QtCore.QBuffer(不是来自文件)播放相同的数据。当我使用文档的示例时,它会出现意外类型的 QBuffer 错
我是一名优秀的程序员,十分优秀!