0

我已通过以下方式覆盖,以在此处调用的派生类updatePaintNode上绘制 OpenGL 纹理。QQuickItemMyQQuickItem

QSGNode *MyQQuickItem::updatePaintNode(QSGNode * oldNode, QQuickItem::UpdatePaintNodeData * /*updatePaintNodeData*/) 
{
  QSGSimpleTextureNode * textureNode = static_cast<QSGSimpleTextureNode *>(oldNode);

  if (!textureNode) {
    textureNode = new QSGSimpleTextureNode();
  }

  QSize size(800, 800);
  // myTextureId is a GLuint here
  textureNode.reset(window()->createTextureFromId(myTextureId, size));
  textureNode->setTexture(my_texture);
  textureNode->markDirty(QSGBasicGeometryNode::DirtyMaterial);

  QSizeF myiewport = boundingRect().size();

  qreal xOffset = 0;
  qreal yOffset = 10;

  textureNode->setRect(xOffset, yOffset, myViewport.width(), myViewport.height());
  return textureNode;
}

这可以很好地呈现纹理内容,但涵盖了我的整个MyQQuickItemUI。

如何减少纹理的底部边距以适应 80% 的高度MyQQuickItem。我想将纹理渲染到一部分 MyQQuickItem并将其余部分留空或黑色?内有可能吗updatePaintNode

注意这里的纹理大小不是UI窗口大小。我的纹理大小是800 x 800。而 UI 窗口大小不同,取决于屏幕。

4

1 回答 1

0

我找到了答案:

更改在Y方向上给出了希望设置myViewport.height()的所需端。类似地,更改会在X方向上给出希望设置的所需端点。myViewport.width()

TextureNode 中的 4 个参数可以在 QQuickItem 的setRect一部分中以人们希望的方式拉伸和适应纹理。

于 2017-09-05T07:20:30.403 回答