Autor podstrony: Krzysztof Zajączkowski

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

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QFile> #include <QTextStream> #include <QDebug> #include <QFileDialog> #include <QMessageBox> #include <QFont> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT void setTextStyleButtonsState(); public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_actionOpen_triggered(); void on_actionZapisz_triggered(); void on_actionBold_triggered(); void on_actionItalic_triggered(); void on_actionUnderline_triggered(); void on_edit_cursorPositionChanged(); // zdarzenie związane z zmianą położenia karetki klawiatury w kontrolce QTextEdit private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H

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

#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // ustawiam akcje związane z formatowaniem jako zaznaczalne ui->actionBold->setCheckable(true); ui->actionItalic->setCheckable(true); ui->actionUnderline->setCheckable(true); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_actionOpen_triggered() // otwieranie pliku tekstowego z formatowaniem ustawionym sztywno na UTF-8 { QString filePath = QFileDialog::getOpenFileName( this, // wskaźnik na rodzica (może być 0, gdy rodzica nie ma) "Open text file", // Text belki tytułowej okna dialogowego QDir::homePath(), // ścieżka startowa "All txt files (*.txt *.ftf);;Txt files (*.txt);;Formatted tekxt file (*.ftf)" // filtr plików ); QFile readFile(filePath); QFileInfo fileInfo(filePath); QString extension = fileInfo.suffix(); // pobieram rozszerzenie wybranego pliku if(readFile.exists()){ if(readFile.open(QIODevice::ReadOnly | QIODevice::Text)){ QTextStream read(&readFile); read.setCodec("UTF-8"); if(extension == "txt"){ // jeżeli rozszerzeniem jest zwykły plik tekstowy txt to ui->edit->setText(read.readAll()); // używam funkcji setText kontrolki klasy QTextEdit }else if(extension == "ftf"){ // a jak rozszerzenie to wymyślone przeze mnie ftf (formatted text file) to ui->edit->setHtml(read.readAll()); // używam funkcji setHtml żeby wczytać tekst z formatowaniem HTML } readFile.close(); } } QTextCursor cursor = ui->edit->textCursor(); cursor.movePosition(QTextCursor::End); ui->edit->setTextCursor(cursor); } void MainWindow::on_actionZapisz_triggered() { qDebug() << ui->edit->toHtml(); QString filePath = QFileDialog::getSaveFileName( this, // wskaźnik na okno rodzica (może być 0, gdy rodzica nie ma) "Save text file", // text belki tytułowej okna dialogowego QDir::homePath(), // ścieżka startowa "All txt files (*.txt *.ftf);;Txt files (*.txt);;Formatted tekxt file (*.ftf)" // filtr ); QFile writeFile(filePath); if(writeFile.open(QIODevice::WriteOnly | QIODevice::Text)){ QTextStream write(&writeFile); write.setCodec("UTF-8"); QFileInfo fileInfo(filePath); QString extension = fileInfo.suffix(); // rozszerzenie pliku if(extension == "txt"){ // jeżeli rozszerzenie to txt to write << ui->edit->toPlainText(); // zapisuję do pliku zwykły tekst }else if(extension == "ftf"){ // a jak rozszerzenie to wymyślone przeze mnie ftf (formatted text file) to write << ui->edit->toHtml(); // to używam funkcji toHtml żeby zapisać w pliku sformatowany tekst z wykorzystaniem HTML-a } writeFile.close(); } } void MainWindow::on_actionBold_triggered() // wciśnięty został przycisk pogrubienia { ui->edit->setFontWeight(ui->edit->fontWeight() == QFont::Bold ? QFont::Normal : QFont::Bold); } void MainWindow::on_actionItalic_triggered() // wciśnięty został przycisk kursywy { ui->edit->setFontItalic(!ui->edit->fontItalic()); } void MainWindow::on_actionUnderline_triggered() // wciśnięty został przycisk podkreślenia { ui->edit->setFontUnderline(!ui->edit->fontUnderline()); } void MainWindow::on_edit_cursorPositionChanged() // zmieniła się pozycja karetki klawiatury { setTextStyleButtonsState(); // ustawianie poprawnego stanu przycisków formatujących tekst } void MainWindow::setTextStyleButtonsState(){ ui->actionUnderline->setChecked( ui->edit->fontUnderline() ); ui->actionBold->setChecked( ui->edit->fontWeight() == QFont::Bold ? true : false ); ui->actionItalic->setChecked( ui->edit->fontItalic() ); }
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
Layout wykonany przez autora strony, wszelkie prawa zastrzeżone. Jakiekolwiek użycie części lub całości grafik znajdujących się na tej stronie bez pisemnej zgody jej autora surowo zabronione.