Qt - kontrolka QTextEdit
Stronę tą wyświetlono już: 3563 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.
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()
);
}