使用QPainter绘制富文本

luf*_*ffy 12 qstring qt 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);
Run Code Online (Sandbox Code Playgroud)

我也尝试使用html标签格式化文本,但它没有帮助(标签打印了文本):

QString equation="<p>K<sub>max</sub></p>=<p>K<sub>2</sub></p>.3"
Run Code Online (Sandbox Code Playgroud)

Myk*_*nko 20

以下是使用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);
}
Run Code Online (Sandbox Code Playgroud)

如果需要在特定点绘制文本,请在绘制之前翻译画家的坐标系:

painter.translate(QPointF(50, 50));
Run Code Online (Sandbox Code Playgroud)

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 );
}
Run Code Online (Sandbox Code Playgroud)

mainWindow.h:

#include <QtGui>

class MainWindow: public QWidget
{
protected:
    void paintEvent(QPaintEvent*);
};
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

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

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

项目文件:

TEMPLATE = app
QT += gui
HEADERS = mainWindow.h
SOURCES = main.cpp mainWindow.cpp
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述


Dmi*_*nov 5

您可以使用受支持的Qt HTML子集来格式化文本.如果您需要绘制格式化文本,您应该使用QTextDocument::drawContents.

QPainter::drawText 是专为纯文本而设计的,没有格式化,而且工作速度更快.