Qt - kontrolka QTextEdit

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

Kontrolka QTextEdit jest obiektem klasy QTextEdit i umożliwia ona wyświetlanie tekstu wieloliniowego i to z zaawansowanym systemem jego formatowania wykorzystującym format HTML. W celu zademonstrowania niektórych możliwości tej kontrolki stworzyłem prosty projekt interfejsu graficznego użytkownika pokazany na poniższym rysunku.

Przykładowy interfejs użytkownika wykorzystujący kontrolkę QTextEdit
Rys. 1
Przykładowy interfejs użytkownika wykorzystujący kontrolkę QTextEdit

Nazwa obiektu klasy QTextEdit to w moim przypadku edit. Dodatkowo dodałem kilka obiektów klasy QAction, czyli akcje związane z pozycjami w menu oraz przyciskami na pasku narzędziowym:

  • actionOpen - pozycja w menu Plik→Otwórz;
  • actionSave - pozycja w menu Plik→Zapisz;
  • actionBold - pozycja w menu Formatowanie→Pogróbienie;
  • actionItalic - pozycja w menu Formatowanie→Kursywa;
  • actionUnderline - pozycja w menu Formatowanie→Podkreślenie

W pliku mainwindow.h:

Listing 1
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QFile>
  5. #include <QTextStream>
  6. #include <QDebug>
  7. #include <QFileDialog>
  8. #include <QMessageBox>
  9. #include <QFont>
  10. namespace Ui {
  11. class MainWindow;
  12. }
  13. class MainWindow : public QMainWindow
  14. {
  15. Q_OBJECT
  16. void setTextStyleButtonsState();
  17. public:
  18. explicit MainWindow(QWidget *parent = 0);
  19. ~MainWindow();
  20. private slots:
  21. void on_actionOpen_triggered();
  22. void on_actionZapisz_triggered();
  23. void on_actionBold_triggered();
  24. void on_actionItalic_triggered();
  25. void on_actionUnderline_triggered();
  26. void on_edit_cursorPositionChanged(); // zdarzenie związane z zmianą położenia karetki klawiatury w kontrolce QTextEdit
  27. private:
  28. Ui::MainWindow *ui;
  29. };
  30. #endif // MAINWINDOW_H

W pliku mainwindow.cpp kod będzie wyglądał następująco:

Listing 2
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent) :
  4. QMainWindow(parent),
  5. ui(new Ui::MainWindow)
  6. {
  7. ui->setupUi(this);
  8. // ustawiam akcje związane z formatowaniem jako zaznaczalne
  9. ui->actionBold->setCheckable(true);
  10. ui->actionItalic->setCheckable(true);
  11. ui->actionUnderline->setCheckable(true);
  12. }
  13. MainWindow::~MainWindow()
  14. {
  15. delete ui;
  16. }
  17. void MainWindow::on_actionOpen_triggered() // otwieranie pliku tekstowego z formatowaniem ustawionym sztywno na UTF-8
  18. {
  19. QString filePath = QFileDialog::getOpenFileName(
  20. this, // wskaźnik na rodzica (może być 0, gdy rodzica nie ma)
  21. "Open text file", // Text belki tytułowej okna dialogowego
  22. QDir::homePath(), // ścieżka startowa
  23. "All txt files (*.txt *.ftf);;Txt files (*.txt);;Formatted tekxt file (*.ftf)" // filtr plików
  24. );
  25. QFile readFile(filePath);
  26. QFileInfo fileInfo(filePath);
  27. QString extension = fileInfo.suffix(); // pobieram rozszerzenie wybranego pliku
  28. if(readFile.exists()){
  29. if(readFile.open(QIODevice::ReadOnly | QIODevice::Text)){
  30. QTextStream read(&readFile);
  31. read.setCodec("UTF-8");
  32. if(extension == "txt"){ // jeżeli rozszerzeniem jest zwykły plik tekstowy txt to
  33. ui->edit->setText(read.readAll()); // używam funkcji setText kontrolki klasy QTextEdit
  34. }else if(extension == "ftf"){ // a jak rozszerzenie to wymyślone przeze mnie ftf (formatted text file) to
  35. ui->edit->setHtml(read.readAll()); // używam funkcji setHtml żeby wczytać tekst z formatowaniem HTML
  36. }
  37. readFile.close();
  38. }
  39. }
  40. QTextCursor cursor = ui->edit->textCursor();
  41. cursor.movePosition(QTextCursor::End);
  42. ui->edit->setTextCursor(cursor);
  43. }
  44. void MainWindow::on_actionZapisz_triggered()
  45. {
  46. qDebug() << ui->edit->toHtml();
  47. QString filePath = QFileDialog::getSaveFileName(
  48. this, // wskaźnik na okno rodzica (może być 0, gdy rodzica nie ma)
  49. "Save text file", // text belki tytułowej okna dialogowego
  50. QDir::homePath(), // ścieżka startowa
  51. "All txt files (*.txt *.ftf);;Txt files (*.txt);;Formatted tekxt file (*.ftf)" // filtr
  52. );
  53. QFile writeFile(filePath);
  54. if(writeFile.open(QIODevice::WriteOnly | QIODevice::Text)){
  55. QTextStream write(&writeFile);
  56. write.setCodec("UTF-8");
  57. QFileInfo fileInfo(filePath);
  58. QString extension = fileInfo.suffix(); // rozszerzenie pliku
  59. if(extension == "txt"){ // jeżeli rozszerzenie to txt to
  60. write << ui->edit->toPlainText(); // zapisuję do pliku zwykły tekst
  61. }else if(extension == "ftf"){ // a jak rozszerzenie to wymyślone przeze mnie ftf (formatted text file) to
  62. write << ui->edit->toHtml(); // to używam funkcji toHtml żeby zapisać w pliku sformatowany tekst z wykorzystaniem HTML-a
  63. }
  64. writeFile.close();
  65. }
  66. }
  67. void MainWindow::on_actionBold_triggered() // wciśnięty został przycisk pogrubienia
  68. {
  69. ui->edit->setFontWeight(ui->edit->fontWeight() == QFont::Bold ? QFont::Normal : QFont::Bold);
  70. }
  71. void MainWindow::on_actionItalic_triggered() // wciśnięty został przycisk kursywy
  72. {
  73. ui->edit->setFontItalic(!ui->edit->fontItalic());
  74. }
  75. void MainWindow::on_actionUnderline_triggered() // wciśnięty został przycisk podkreślenia
  76. {
  77. ui->edit->setFontUnderline(!ui->edit->fontUnderline());
  78. }
  79. void MainWindow::on_edit_cursorPositionChanged() // zmieniła się pozycja karetki klawiatury
  80. {
  81. setTextStyleButtonsState(); // ustawianie poprawnego stanu przycisków formatujących tekst
  82. }
  83. void MainWindow::setTextStyleButtonsState(){
  84. ui->actionUnderline->setChecked(
  85. ui->edit->fontUnderline()
  86. );
  87. ui->actionBold->setChecked(
  88. ui->edit->fontWeight() == QFont::Bold ? true : false
  89. );
  90. ui->actionItalic->setChecked(
  91. ui->edit->fontItalic()
  92. );
  93. }
Przykład działania podstawowego formatowania tekstu w kontrolce QTextEdit
Rys. 2
Przykład działania podstawowego formatowania tekstu w kontrolce klasy QTextEdit
Strony powiązane
strony powiązane
  1. doc.qt.io/qt-4.8/qtextedit.html - opis klasy QTextEdit na stronie dokumentacji Qt

Komentarze