如何调整纹理大小以仅占用QQuickItem UI

时间:2017-09-04 20:25:33

标签: qt opengl opengl-es qquickitem qsgclipnode

我已按以下方式覆盖updatePaintNode,以便在QQuickItem派生的类MyQQuickItem上绘制一个OpenGL纹理。

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;
}

这样可以很好地呈现纹理内容,但覆盖了整个MyQQuickItem UI。

如何减少纹理的下边距,使其适合MyQQuickItem的80%高度。 我想将纹理渲染到 MyQQuickItem&amp;的一部分。剩下的是空白还是黑色?这可能在updatePaintNode内。

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

1 个答案:

答案 0 :(得分:0)

我找到了答案:

更改myViewport.height()会在希望设置的 Y 方向中提供所需的结尾。同样,更改myViewport.width()会在希望设置的 X 方向上给出所需的结尾。

TextureNode&#39; s setRect中的4个参数可以拉伸&amp;在QQuickItem的一部分中按照自己的方式拟合纹理。