繁体   English   中英

如何在QQuickItem中绘制文本

[英]how to draw text in QQuickItem

我一直在互联网上搜索如何在 QQuickItem 上绘制或渲染文本,但无济于事。 我选择不使用使用 QPainter 绘制()函数的 QQuickPaintedItem。 除此之外,在 iOS 视网膜显示设备上还有一个已知的 QQuickPaintedItem 问题,其中显示模糊且边缘不清晰。

请就此提出任何可能的解决方法。

由于 QtDeclarative 已被弃用,我选择不使用使用 QPainter 绘制()函数的 QQuickPaintedItem

这种说法没有多大意义。 QtDeclarative是 QtQuick1, QQuickPaintedItem是 QtQuick2 模块的一部分,与QtDeclarative无关。 此外,即使它使用QPainter它仍然使用 OpenGL 进行硬件加速。

如果没有QPainter或任何其他类似类的帮助,重载自定义QQuickItem以在其中手动绘制文本将是一项非常复杂的任务。

QQuickItem基本上是 QML 的Item元素背后的类。 QML 还有一个Text元素。 QML 是为快速 UI 开发而设计的,手动绘制文本完全没有意义。 为此,您不需要任何 C++,只需要 QML:

Item {
    Text {
        text: "something"
    }
}

查看Text元素及其属性,您可以指定字体、颜色等。 您也可以直接使用该元素作为图形效果的来源。

您可以使用 QPainter 像画布一样在 QImage 上进行绘制。 然后您可以将其转换为可以分配给 QSGSimpleTextureNode 的 QSGTexture。

这是我最近为执行此操作而编写的代码摘录:

QColor color("steelblue");
QRect rect(0,0,aw, ah);
for(auto ch: m_charList){
    QImage canvas(rect.width(), rect.height(), QImage::Format_RGBA8888);
    canvas.fill(QColor("transparent"));
    QPainter painter(&canvas);

    QFont font = painter.font();
    //font.setPixelSize(48);
    font.setPixelSize(rect.width());
    font.setBold(true);
    painter.setFont(font);
    painter.setPen(color);

    QRect bounding = QRect(0, 0, rect.width(), rect.height());
    painter.drawText(0, 0, rect.width(), rect.height(), Qt::AlignCenter, ch, &bounding);

    QSGTexture *texture = this->window()->createTextureFromImage(canvas);
    m_textureList[ch] = texture;
}

上下文中包含完整工作代码的 repo 在这里

想要这样渲染的原因有很多。 您可以在 3D 空间中对 QSGNodes 进行旋转。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM