Qt - rysowanie sformatowanego tekstu za pomocą obiektu klasy QTextDocument

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 2070 razy

Klasa QTextDocument umożliwia zaawansowanie formatowanie tekstu z wykorzystaniem znaczników HTML co sprawia, że cała wiedza nabyta podczas nauki HTML-a i CSS-a może być wykorzystana do formatowania rysowanego tekstu. Niestety nie wszystko jest tak dobrze obsłużone jak w przeglądarkach internetowych co objawia się brakiem reakcji na niektóre style formatowania HTML. Oto prosty przykład wykorzystania klasy QTextDocument:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // tworzę style globalne QString style = "p{ font-size: 12px; text-align: justify; }" ".equation { text-align: center; font-size: 16px; background-color: white; }" ".equation > span { font-size: 16px; }" ".equation > sup {font-size: 16px; }"; // dodaję style globalne textDocument.setDefaultStyleSheet(style); // wstawiam sformatowany tekst HTML textDocument.setHtml("<p>And Einsain say:</p>" "<p class='equation'>" "<span style='color: red'>E</span>" "=m·" "<span style='color: orange'>c</span>" "<sup>2</sup>" "</p>" "<p>And after that Sun sometime rises on Earth twice</p>"); } MainWindow::~MainWindow() { delete ui; } void MainWindow::paintEvent(QPaintEvent *event){ QWidget::paintEvent(event); QPainter painter; painter.begin(this); // ustawiam rozmiar strony dokumentu dostosowując go do wymiarów okna textDocument.setPageSize(this->size()); // rysuję zawartość dokumentu textDocument.drawContents(&painter); painter.end(); }

Wynik działania powyższego kodu można zobaczyć na poniższym rysunku.

Qt Creator - przykład wykorzystania klasy QTextDocument do formatowania tekstu
Rys. 1
Qt Creator - przykład wykorzystania klasy QTextDocument do formatowania tekstu

Jak widać obsługiwane są również i encje używane w HTML-u co można wykorzystać do wstawiania znanych znaków specjalnych.

Można w obiekcie klasy QTextDocument osadzić grafikę, wystarczy nieco zmodyfikować wcześniejszy kod:

// tworzę style globalne QString style = "p{ font-size: 12px; text-align: justify; }" ".equation { text-align: center; font-size: 16px; background-color: white; }" ".equation > span { font-size: 16px; }" ".equation > sup {font-size: 16px; }" "img { max-width: 100%; }" "p.image { text-align: center; }"; // dodaję style globalne textDocument.setDefaultStyleSheet(style); QString imageUrl = "img://fog.jpg"; // ścieżka do pliku image.load(":/images/fog.jpg"); // wczytuję plik z zasobów image = image.scaledToWidth(200); // skaluję plik // dodaję plik do zasobów textDocument textDocument.addResource(QTextDocument::ImageResource, QUrl(imageUrl), image); // wstawiam sformatowany tekst HTML textDocument.setHtml("<p>And Einsain say:</p>" "<p class='equation'>" "<span style='color: red'>E</span>" "=m·" "<span style='color: orange'>c</span>" "<sup>2</sup>" "</p>" "<p>And after that Sun sometime rises on Earth twice</p>" "<p class='image'><img src='img://fog.jpg' style='width: 250px'/></p>" );

Wynik działania powyższego kodu objawia się w sposób pokazany poniżej.

Qt Creator - wynik osadzenia grafiki w obiekcie klasy QTextDocument
Rys. 2
Wynik osadzenia grafiki w obiekcie klasy QTextDocument
Strony powiązane
strony powiązane
  1. doc.qt.io/qt-5/qtextdocument.html - opis klasy QTextDocument dostępny na stronie Qt
  2. doc.qt.io/qt-4.8/qpainter.html - opis klasy QPainter dostępny na stronie Qt