Qt - rysowanie sformatowanego tekstu za pomocą obiektu klasy QTextDocument

Stronę tą wyświetlono już: 66 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:

Listing 1
  1. MainWindow::MainWindow(QWidget *parent) :
  2. QMainWindow(parent),
  3. ui(new Ui::MainWindow)
  4. {
  5. ui->setupUi(this);
  6. // tworzę style globalne
  7. QString style = "p{ font-size: 12px; text-align: justify; }"
  8. ".equation { text-align: center; font-size: 16px; background-color: white; }"
  9. ".equation > span { font-size: 16px; }"
  10. ".equation > sup {font-size: 16px; }";
  11. // dodaję style globalne
  12. textDocument.setDefaultStyleSheet(style);
  13. // wstawiam sformatowany tekst HTML
  14. textDocument.setHtml("<p>And Einsain say:</p>"
  15. "<p class='equation'>"
  16. "<span style='color: red'>E</span>"
  17. "=m·"
  18. "<span style='color: orange'>c</span>"
  19. "<sup>2</sup>"
  20. "</p>"
  21. "<p>And after that Sun sometime rises on Earth twice</p>");
  22. }
  23. MainWindow::~MainWindow()
  24. {
  25. delete ui;
  26. }
  27. void MainWindow::paintEvent(QPaintEvent *event){
  28. QWidget::paintEvent(event);
  29. QPainter painter;
  30. painter.begin(this);
  31. // ustawiam rozmiar strony dokumentu dostosowując go do wymiarów okna
  32. textDocument.setPageSize(this->size());
  33. // rysuję zawartość dokumentu
  34. textDocument.drawContents(&painter);
  35. painter.end();
  36. }

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:

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

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

Komentarze