在Qt里面,任何一个文本编辑的程序都要用到类QTextEdit作为输入文本的容器,
在这个里可编辑的文本由QTextDocument作为载体,用来QTextDocument的元素的
QTextBlock,QTextList,QTextFrame等是QTextDocument的不同表现形式。
每个元素都有自己的格式,而关于文本编辑用到的最常用的类是QTextCursor,它
提供了对QTextDocument文档的修改接口,对于文本的修改,都与光标有关。
下面的代码是关于文本编辑的简单示例, 涉及到文本编辑的:
A.设置字体
B.设置字号
C.设置颜色
D.加粗
E.设置颜色
~~~~~~~~~~~~~~~~~~上代码~~~~~~~~~~~~~~~~~~~~~~
file_widget.h
#ifndef FILEWIDGET_H #define FILEWIDGET_H #include <QFileDialog> #include <QWidget> #include <QPushButton> #include <QLabel> #include <QHBoxLayout> #include <QFile> #include <QIODevice> #include <QTextEdit> #include <QVBoxLayout> #include <QTextStream> #include <QMessageBox> #include <QPrintDialog> #include <QPrinter> #include <QFontComboBox> #include <QComboBox> #include <QFontDatabase> #include <QTextCharFormat> #include <QTextCursor> #include <QColorDialog> class FileWidget : public QWidget { Q_OBJECT public: explicit FileWidget(QWidget *parent = 0); void mergeFormat(QTextCharFormat format); public slots: void slotOpenFileDialog(); //打开打开文件对话框 void slotPrintText(); //--文本打印新增 --------打印文本文件 void slotShowFontComboBox(QString comboStr); //--字库 void slotShowSizeSpinBox(QString spinValue); void slotShowBoldBtn(); //---加粗 void slotShowUnderlineBtn(); //--下划线 void slotShowColorBtn(); //--颜色 void slotShowCurrentFormatChanged(const QTextCharFormat &fmt); //--设置字符格式 private: QPushButton *openBtn; QPushButton *printBtn; //---文本打印按钮 QPushButton *colorBtn; //---颜色按钮 QPushButton *underlineBtn; //--下划线按钮 QPushButton *boldBtn; //--字体加粗按钮 QFontDatabase fontDataBase; QFontComboBox *fontComboBox; //--字体 QComboBox *sizeComboBox; //字号 QLabel *tipsLabel; QLabel *fontLabel; //字体标签 QLabel *fontSizeLabel; // 字号 QTextEdit *showText; }; #endif //FILEWIDGET_H
#include "file_widget.h" FileWidget::FileWidget(QWidget *parent /*= 0*/) : QWidget(parent) { //----showText showText = new QTextEdit(); //---按钮与label boldBtn = new QPushButton("Bold", this); //--文本加粗按钮 boldBtn->setCheckable(true); //--设置按钮属性的值 colorBtn = new QPushButton("Color", this); //--文本颜色按钮 colorBtn->setCheckable(true); underlineBtn = new QPushButton("UnderLine", this); //-文本下划线按钮 underlineBtn->setCheckable(true); printBtn = new QPushButton("print", this); //---文本打印新增 openBtn = new QPushButton("OPEN", this); //---打开文件按钮 fontComboBox = new QFontComboBox(); //--字体 fontComboBox->setFixedSize(70,30); sizeComboBox = new QComboBox; //---字号 sizeComboBox->setFixedSize(70,30); fontLabel = new QLabel("font", this); //--字体label fontSizeLabel = new QLabel("Size", this); //--字号label //---设置字号 foreach(int size, fontDataBase.standardSizes()) { sizeComboBox->addItem(QString :: number(size)); } //----设置信号与槽 connect(fontComboBox, SIGNAL(activated(QString)), this, SLOT(slotShowFontComboBox(QString))); // ---字库 connect(sizeComboBox, SIGNAL(activated(QString)), this, SLOT(slotShowSizeSpinBox(QString))); //--字号 connect(boldBtn, SIGNAL(clicked()), this, SLOT(slotShowBoldBtn())); //--加粗 connect(colorBtn, SIGNAL(clicked()), this, SLOT(slotShowColorBtn())); //--颜色 connect(underlineBtn, SIGNAL(clicked()), this, SLOT(slotShowUnderlineBtn())); //--下划线 connect(showText, SIGNAL(currentCharFormatChanged(const QTextCharFormat )), this, SLOT(slotShowCurrentFormatChanged(const QTextCharFormat &fmt))); //---字体 //--这里调用函数setFontFilters()过滤, 显示某一类字体。 默认的情况下为QFontComboBox::AllFonts将列出所有字体 fontComboBox->setFontFilters(QFontComboBox :: ScalableFonts); //---设置文本打开按钮与打印文本按钮信号与槽 connect(openBtn, SIGNAL(clicked()), this, SLOT(slotOpenFileDialog())); connect(printBtn, SIGNAL(clicked()), this, SLOT(slotPrintText())); //---文本打印新增 tipsLabel = new QLabel("open file...", this); //---按钮与label布局 QVBoxLayout *vLayout = new QVBoxLayout(); vLayout->addStretch(); vLayout->addWidget(tipsLabel); vLayout->addWidget(openBtn); vLayout->addWidget(printBtn); //---文本打印新增 vLayout->addWidget(boldBtn); vLayout->addWidget(colorBtn); vLayout->addWidget(underlineBtn); vLayout->addWidget(fontLabel); vLayout->addWidget(fontComboBox); vLayout->addWidget(fontSizeLabel); vLayout->addWidget(sizeComboBox); vLayout->addStretch(); vLayout->setSpacing(10); //---3个控件整体布局 QHBoxLayout *hLayout = new QHBoxLayout(this); hLayout->addLayout(vLayout); hLayout->addWidget(showText); hLayout->setSpacing(10); hLayout->setContentsMargins(10, 10, 10, 10); //--显示布局 setLayout(hLayout); //---窗口大小 resize(600, 400); setWindowTitle("TextEdit"); } //------打开文件对话框 void FileWidget::slotOpenFileDialog() { /* getOpenFileName函数说明 函数原形: QStringList QFileDialog::getOpenFileNames( QWidget * parent = 0, const QString & caption = QString(), // 打开文件对话框的标题 const QString & dir = QString(), // 查找目录 const QString & filter = QString(), // 设置需要过滤的文件格式 QString * selectedFilter = 0, Options options = 0) [static] */ //---获取文件名 QString fileName = QFileDialog :: getOpenFileName(this, NULL, NULL, "*.h *.cpp *.txt"); //---打开文件并读取文件内容 QFile file(fileName); //--打开文件成功 if (file.open(QIODevice ::ReadOnly | QIODevice ::Text)) { QTextStream textStream(&file); while (!textStream.atEnd()) { //---QtextEdit按行显示文件内容 showText->append(textStream.readLine()); } } else //---打开文件失败 { /* information函数参数说明: 函数原型 QMessageBox::information( QWidget * parent, const QString & title, //--- 标题 const QString & text, //---显示内容 StandardButtons buttons = Ok, //---OK按钮 StandardButton defaultButton = NoButton) [static] */ QMessageBox ::information(NULL, NULL, "open file error"); } } //---打印文本 void FileWidget::slotPrintText() { QPrinter printer; //--新建一个QPrinter对象 QPrintDialog printDlg(&printer, this); if (printDlg.exec()) //---用来判断用户是否点击了打印对话框上的“打印”按钮 { //----获取文本内容 QTextDocument *doc = showText->document(); // ---打开打印对话窗口 doc->print(&printer); } } //---设置字体 void FileWidget::slotShowFontComboBox(QString comboStr) { QTextCharFormat fmt; fmt.setFontFamily(comboStr); mergeFormat(fmt); } //---文本区域应用光标格式 void FileWidget::mergeFormat(QTextCharFormat format) { //---获取文本框中的光标 QTextCursor cursor = showText->textCursor(); //---文本是否为选区 if (!cursor.hasSelection()) { cursor.select(QTextCursor::WordUnderCursor); } //---设置光标对应的格式 cursor.mergeCharFormat(format); //--将光标设置的格式应用到文本区域 showText->mergeCurrentCharFormat(format); } //---设置字号 void FileWidget::slotShowSizeSpinBox(QString spinValue) { QTextCharFormat fmt; fmt.setFontPointSize(spinValue.toFloat()); showText->mergeCurrentCharFormat(fmt); } //---加粗 void FileWidget::slotShowBoldBtn() { QTextCharFormat fmt; fmt.setFontWeight(boldBtn->isChecked()?QFont :: Bold : QFont :: Normal); showText->mergeCurrentCharFormat(fmt); } //----下划线 void FileWidget::slotShowUnderlineBtn() { QTextCharFormat fmt; fmt.setFontUnderline(underlineBtn->isChecked()); showText->mergeCurrentCharFormat(fmt); } //---颜色 void FileWidget::slotShowColorBtn() { //----使用标准颜色对话框获取颜色值 QColor color = QColorDialog :: getColor(Qt :: blue, this); //--设定默认选定的颜色 这里请参考assistant if (color.isValid()) { QTextCharFormat fmt; fmt.setForeground(color); showText->mergeCurrentCharFormat(fmt); } } void FileWidget::slotShowCurrentFormatChanged(const QTextCharFormat &fmt) { fontComboBox->setCurrentIndex(fontComboBox->findText(fmt.fontFamily())); sizeComboBox->setCurrentIndex(sizeComboBox->findText(QString :: number(fmt.fontPointSize()))); boldBtn->setChecked(fmt.font().bold()); underlineBtn->setChecked(fmt.fontUnderline()); }
#pragma once #include <QtWidgets/QApplication> #include "file_widget.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); ////---解决中文乱码 //QTextCodec *codec = QTextCodec::codecForName("GB18030"); FileWidget win; win.show(); return a.exec(); }
附上运行结果