2015-04-27 13 views
10

Czy istnieje sposób na narysowanie stałego tekstu z indeksami dolnymi. Moim celem jest mieć coś takiego: „K_max = K_2 3”Narysuj tekst sformatowany za pomocą QPaintera

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

Próbowałem też formatowanie tekstu za pomocą znaczników HTML, ale to nie pomogło (znaczniki zostały wydrukowane z tekstem):

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

Można pokazać go w QLabel, jak: 'QLabel lbl ("

K max

=

K

.3 "); lbl.show(); '. – vahancho

+0

Dziękuję za odpowiedź, ale próbuję wydrukować tekst do pliku pdf przy użyciu QPrinter jako urządzenia do malowania. – luffy

+0

Możesz ustawić ten kod HTML na etykiecie, a następnie pobrać zawartość etykiety jako pixmapę i pomalować tekst jako obraz z twoją drukarką. W przeciwnym razie nie ma takiej funkcji, która obsługuje formuły losowania. – vahancho

Odpowiedz

18

Oto pełny przykład użycia tekstu sformatowanego 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); 
} 

Jeśli trzeba wyciągnąć tekst w określonym punkcie, tłumaczyć układ współrzędnych malarza przed rysunek:

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

mainWindow.cpp - inne rozwiązanie:

#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(); 
} 

Plik projektu:

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

Wynik:

enter image description here

+0

Masz przeciek pamięci w 'main'. Ale przychodzi mi pisanie próbek do mojej odpowiedzi :) –

+0

@SaZ Dzięki za wskazanie przecieku. Naprawiony. –

+1

Dzięki, próbowałem tego i działa dobrze dla pozycji (0, 0), ale tak szybko, jak próbuję przenieść tekst do predefiniowanej pozycji na stronie ("ctx.clip = QRectF (x, y, 400, 100); ") znika! Jakieś pomysły, jak to naprawić? – luffy

5

Do formatowania tekstu można używać obsługiwanego formatu Qt HTML subset. Jeśli chcesz narysować sformatowany tekst, powinieneś użyć QTextDocument::drawContents.

QPainter::drawText jest przeznaczony do zwykłego tekstu bez formatowania i działa znacznie szybciej.

Powiązane problemy