Нарисуйте богатый текст с помощью QPainter

Есть ли способ сделать фиксированный текст с индексом. Моя цель - иметь что-то вроде: "K_max = K_2. 3"

QString equation="K_max=K_2 . 3";
painter.drawText( QRect(x, y , width, y+height), Qt::AlignLeft|Qt::AlignVCenter, equation);

Я также пробовал форматировать текст, используя теги html, но это не помогло (теги были напечатаны с текстом):

QString equation="<p>K<sub>max</sub></p>=<p>K<sub>2</sub></p>.3"

Ответ 1

Вот полный пример использования богатого текста QTextDocument.

mainwindow.cpp:

#include "mainWindow.h"

void MainWindow::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    QTextDocument td;
    td.setHtml("K<sub>max</sub>=K<sub>2</sub> &middot; 3");
    td.drawContents(&painter);
}

Если вам нужно нарисовать текст в определенной точке, переведите систему координат художника перед рисованием:

painter.translate(QPointF(50, 50));

mainWindow.cpp - Другое решение:

#include "mainWindow.h"

void MainWindow::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    QTextDocument td;
    td.setHtml("K<sub>max</sub>=K<sub>2</sub> &middot; 3");
    QAbstractTextDocumentLayout::PaintContext ctx;
    ctx.clip = QRectF( 0, 0, 400, 100 );
    td.documentLayout()->draw( &painter, ctx );
}

mainwindow.h:

#include <QtGui>

class MainWindow: public QWidget
{
protected:
    void paintEvent(QPaintEvent*);
};

main.cpp:

#include <QtGui>
#include "mainWindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow mainWindow;
    mainWindow.show();
    return app.exec();
}

Файл проекта:

TEMPLATE = app
QT += gui
HEADERS = mainWindow.h
SOURCES = main.cpp mainWindow.cpp

Результат:

enter image description here

Ответ 2

Вы можете использовать поддерживаемый подмножество Qt HTML для форматирования вашего текста. Если вам нужно нарисовать форматированный текст, вы должны использовать QTextDocument::drawContents.

QPainter::drawText предназначен для простого текста без форматирования, и он работает намного быстрее.