Как рисовать текст в 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 за один.

Другие вопросы по тегам