Как рисовать текст в QQuickItem
Я искал в интернете, как рисовать или отображать текст на QQuickItem, но безрезультатно. Я предпочитаю не использовать QQuickPaintedItem, который использует функцию рисования QPainter. Помимо этого, существует также известная проблема QQuickPaintedItem на устройствах отображения сетчатки iOS, где изображение размыто, а края не резкие.
Пожалуйста, посоветуйте любой возможный способ обойти это.
1 ответ
Поскольку QtDeclarative уже устарел, я решил не использовать QQuickPaintedItem, который использует функцию QPainter paint()
Это утверждение не имеет большого смысла. QtDeclarative
это QtQuick1, QQuickPaintedItem
является частью модуля QtQuick2 и не имеет ничего общего с QtDeclarative
, Кроме того, хотя он использует QPainter
это все еще аппаратно ускоряется с помощью OpenGL.
Перегрузка кастома QQuickItem
нарисовать текст в нем вручную, без помощи QPainter
или любой другой подобный класс будет очень сложной задачей.
QQuickItem
в основном класс позади QML Item
элемент. QML также имеет Text
элемент. QML был разработан для быстрой разработки пользовательского интерфейса, рисовать текст вручную совершенно бессмысленно. Для этого вам не нужен C++, только QML:
Item {
Text {
text: "something"
}
}
Посмотрите на Text
Элемент и его свойства, вы можете указать шрифт, цвет и еще много чего. Вы также можете напрямую использовать элемент в качестве источника для графических эффектов.
Вы можете использовать QPainter для рисования на QImage как на холсте. Затем вы можете превратить это в QSGTexture, который можно назначить QSGSimpleTextureNode.
Вот отрывок кода, который я недавно написал для этого:
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;
}
Репо с полным рабочим кодом в контексте здесь.
Есть МНОГИЕ причин, чтобы захотеть сделать такой рендеринг. Вы можете делать вращения в трехмерном пространстве для QSGNodes за один.