3

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

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

4

2 回答 2

2

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

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

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

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

Item {
    Text {
        text: "something"
    }
}

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

于 2015-04-14T15:39:46.770 回答
1

您可以使用 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 进行一次旋转。

于 2019-10-28T19:37:31.833 回答