как рисовать текст в QQuickItem

Я искал в Интернете, как рисовать или отображать текст на QQuickItem, но безрезультатно. Я предпочитаю не использовать QQuickPaintedItem, который использует функцию QPainter paint (). Помимо этого, существует также известная проблема QQuickPaintedItem на устройствах отображения Retina iOS, когда изображение размыто, а края нечеткие.

Пожалуйста, сообщите о возможных способах решения этой проблемы.


person matteoL    schedule 14.04.2015    source источник


Ответы (2)


Поскольку QtDeclarative уже устарел, я предпочитаю не использовать QQuickPaintedItem, который использует функцию QPainter paint ()

В этом заявлении нет большого смысла. QtDeclarative - это QtQuick1, QQuickPaintedItem является частью модуля QtQuick2 и не имеет ничего общего с QtDeclarative. Более того, даже несмотря на то, что он использует QPainter, он по-прежнему имеет аппаратное ускорение с помощью OpenGL.

Перегрузка пользовательского QQuickItem для рисования в нем текста вручную без помощи QPainter или любого другого аналогичного класса будет очень сложной задачей.

QQuickItem - это в основном класс, стоящий за элементом Item QML. QML также имеет элемент Text. QML был разработан для быстрой разработки пользовательского интерфейса, рисовать текст вручную совершенно бессмысленно. Для этого не нужен C ++, только QML:

Item {
    Text {
        text: "something"
    }
}

Взгляните на элемент Text и его свойства, вы можете указать шрифт, цвет и многое другое. Вы также можете напрямую использовать элемент как источник для графических эффектов.

person dtech    schedule 14.04.2015
comment
Извините за путаницу в приведенном выше утверждении. Я уже знаю о Text QML Type. Однако я хотел отобразить текст в каждом узле настраиваемой геометрии, который сформировал один узел QSGNode. Можно ли визуализировать текст после создания геометрического узла? То же самое с поведением QPainter, где вы можете нарисовать прямоугольник, а затем нарисовать на нем текст. TIA. - person matteoL; 14.04.2015
comment
Вы не можете отображать текст в геометрическом узле. Чего бы вы ни пытались достичь, я думаю, что вы идете неверным путем. Вы можете создать геометрию для текста вручную и использовать ее в узле геометрии, но я бы сказал, что это очень плохая идея. - person dtech; 14.04.2015
comment
Спасибо @ddriver. Можете ли вы дать совет и подсказку, что мне делать, чтобы нарисовать этот образец с текстом внутри каждого многоугольника. - person matteoL; 15.04.2015
comment
@ user1870074 - вы могли бы QQuickItem реализовать настоящую стреловидную штуковину, это должно быть достаточно просто, и просто поместите в нее элемент Text. Так будет удобнее и удобнее работать. QML является модульным, один элемент отображает одну вещь, нет элемента QML, который отображал бы более одной функции за раз. Если вы не используете QQuickPaintedItem, в этом случае вы можете использовать QPainter для рисования нескольких объектов. - person dtech; 15.04.2015
comment
Что, если вы сначала попробуете использовать Text (в QML) и JS и увидите, что это слишком медленно? - person Nils; 23.11.2018

Вы можете использовать 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 за один.

person Demolishun    schedule 28.10.2019