我一直在互联网上搜索如何在 QQuickItem 上绘制或渲染文本,但无济于事。我选择不使用使用 QPainter paint() 函数的 QQuickPaintedItem。除此之外,iOS 视网膜显示设备上还有一个已知的 QQuickPaintedItem 问题,其中显示模糊且边缘不清晰。
请就此提出任何可能的解决方法。
我一直在互联网上搜索如何在 QQuickItem 上绘制或渲染文本,但无济于事。我选择不使用使用 QPainter paint() 函数的 QQuickPaintedItem。除此之外,iOS 视网膜显示设备上还有一个已知的 QQuickPaintedItem 问题,其中显示模糊且边缘不清晰。
请就此提出任何可能的解决方法。
由于 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元素及其属性,可以指定字体、颜色等。您也可以直接将元素用作图形效果的来源。
您可以使用 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 进行一次旋转。