Редактирование текста QT и набор текста включают настройки, связанные со шрифтом, выравнивание абзаца и методы сортировки.
представлять
1. Функция работы с файлами, использование QFileDialog
класса для открытия существующего файла, использование QFile
и QTextStream
реализация чтения содержимого файла и т. д.
2. Функция редактирования текста, используйте кнопку на панели инструментов, чтобы использовать стандартное диалоговое окно для реализации настройки шрифта текста. , размер шрифта, полужирный, курсив, подчеркивание, цвета шрифта и т. д.
3. Функция набора текста, реализация сортировки текста, выравнивания текста, отмены и повтора действий и т. д.
создание проекта
файл showwidget.h
class ShowWidget : public QWidget
{
Q_OBJECT
public:
explicit ShowWidget(QWidget *parent = nullptr);
QTextEdit *text;
signals:
};
файл showwidget.cpp
ShowWidget::ShowWidget(QWidget *parent) : QWidget(parent)
{
text = new QTextEdit(this);
QGridLayout *showWidgetLayout = new QGridLayout(this);
showWidgetLayout->addWidget(text);
}
файл simpletexteditor.h
Объявите различные элементы, необходимые для реализации главного окна, включая меню, панели инструментов и действия.
class SimpleTextEditor : public QMainWindow
{
Q_OBJECT
public:
SimpleTextEditor(QWidget *parent = nullptr);
~SimpleTextEditor();
void CreateAction(); // 创建动作
void CreateMenus(); // 创建菜单
void CreateToolBars(); // 创建工具栏
private:
QString fileName; // 打开的文件名
ShowWidget *showWidget; //中心部件
QMenu *fileMenu; // 文件 菜单
QMenu *editMenu; // 编辑 菜单
// 文件菜单项
QAction *openFileAction; // 打开
QAction *newFileAction; // 新建
QAction *printFileAction; // 打印
QAction *exitAction; // 退出
// 编辑菜单项
QAction *copyAction; // 复制
QAction *cutAction; // 剪切
QAction *pasteAction; // 粘贴
QAction *undoAction; // 撤销
QAction *redoAction; // 重做
QAction *aboutAction; // 关于
// 工具栏
QToolBar *fileToolBar; // 文件
QToolBar *editToolBar; // 编辑
QToolBar *doToolBar; // undo redo
};
файл simpletexteditor.cpp
SimpleTextEditor::SimpleTextEditor(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle(tr("Simple Text Editor"));
showWidget = new ShowWidget(this);
setCentralWidget(showWidget);
QStatusBar *statusbar = statusBar();
statusbar->showMessage("欢迎 Welcome");
// 创建 动作 菜单 工具栏
CreateActions();
CreateMenus();
CreateToolBars();
}
Реализация меню и панелей инструментов
И меню, и инструмент
QAction
относятся к классу.Функциональные кнопки на панели инструментов и параметры в меню соответствуют одним и тем же функциям и используют одни и те же сочетания клавиш и значки.
Реализация действия Действие
SimpleTextEditor::CreateActions()
реализован в функции
void SimpleTextEditor::CreateActions()
{
// 文件菜单项
// 打开
//创建打开文件动作同时指定图标、名称和父窗口
openFileAction = new QAction(QIcon(":/open"),tr("打开"),this);
// 为 打开文件动作 设置组合快捷键
openFileAction->setShortcut(tr("Ctrl+O"));
// 设置 状态栏显示 光标移动到这里时 状态栏显示同时
openFileAction->setStatusTip(tr("打开一个文件"));
// 新建
newFileAction = new QAction(QIcon(":/new"),tr("新建"),this);
newFileAction->setShortcut(tr("Ctrl+N"));
newFileAction->setStatusTip(tr("新建一个文件"));
// 打印
printFileAction = new QAction(QIcon(":/printText"),tr("打印文本"),this);
printFileAction->setStatusTip(tr("打印一个文本"));
// 退出
exitAction = new QAction(tr("退出"),this);
exitAction->setShortcut(tr("Ctrl+Q"));
exitAction->setStatusTip(tr("退出 程序"));
connect(exitAction,SIGNAL(triggered()),this,SLOT(close()));
// 编辑菜单项
// 复制
copyAction = new QAction(QIcon(":/copy"),tr("复制"),this);
copyAction->setShortcut(tr("Ctrl+C"));
copyAction->setStatusTip(tr("复制文件"));
connect(copyAction,SIGNAL(triggered()),showWidget->text,SLOT(copy()));
// 剪切
cutAction = new QAction(QIcon(":/cut"),tr("剪切"),this);
cutAction->setShortcut(tr("Ctrl+X"));
cutAction->setStatusTip(tr("剪切文件"));
connect(cutAction,SIGNAL(triggered()),showWidget->text,SLOT(cut()));
// 粘贴
pasteAction = new QAction(QIcon(":/paste"),tr("粘贴"),this);
pasteAction->setShortcut(tr("Ctrl+P"));
pasteAction->setStatusTip(tr("粘贴文件"));
connect(pasteAction,SIGNAL(triggered()),showWidget->text,SLOT(copy()));
// 撤销
undoAction = new QAction(QIcon(":/undo"),tr("撤销"),this);
undoAction->setShortcut(tr("Ctrl+Z"));
undoAction->setStatusTip(tr("撤销"));
connect(undoAction,SIGNAL(triggered()),showWidget->text,SLOT(undo()));
// 重做
redoAction = new QAction(QIcon(":/redo"),tr("重做"),this);
redoAction->setShortcut(tr("Ctrl+Y"));
redoAction->setStatusTip(tr("重做"));
connect(redoAction,SIGNAL(triggered()),showWidget->text,SLOT(redo()));
// 关于
// 也可不指定图标,通常只在菜单中出现,不在工具栏上显示
aboutAction = new QAction(tr("关于"),this);
connect(aboutAction,SIGNAL(triggered()),this,SLOT(QApplication::aboutQt()));
}
Реализация меню
SimpleTextEditor::CreateMenus()
реализован в функции
void SimpleTextEditor::CreateMenus()
{
// 文件菜单
// menuBar() 获取主窗口的菜单栏指针
// addMenu() 向菜单栏中插入一个新菜单
fileMenu = menuBar()->addMenu(tr("文件"));
fileMenu->addAction(openFileAction); // 插入菜单项
fileMenu->addAction(newFileAction);
fileMenu->addSeparator();
fileMenu->addAction(printFileAction);
fileMenu->addSeparator();
fileMenu->addAction(exitAction);
// 编辑菜单项
editMenu = menuBar()->addMenu(tr("编辑"));
editMenu->addAction(copyAction); // 插入菜单项
editMenu->addAction(cutAction);
editMenu->addAction(pasteAction);
fileMenu->addSeparator();
editMenu->addAction(undoAction);
editMenu->addAction(redoAction);
fileMenu->addSeparator();
editMenu->addAction(aboutAction);
}
Реализация инструментов (ToolBars)
SimpleTextEditor::CreateToolBars()
реализован в функции
void SimpleTextEditor::CreateToolBars()
{
// 文件 工具栏
fileToolBar = addToolBar(tr("File"));
fileToolBar->addAction(openFileAction);
fileToolBar->addAction(newFileAction);
fileToolBar->addAction(printFileAction);
// 编辑 工具栏
editToolBar = addToolBar(tr("Edit"));
editToolBar->addAction(copyAction);
editToolBar->addAction(cutAction);
editToolBar->addAction(pasteAction);
// undo redo 工具栏
doToolBar = addToolBar(tr("UndoRedo"));
doToolBar->addAction(undoAction);
doToolBar->addAction(redoAction);
}
simpletexteditor.h
Добавить функцию слота вNewFile
...
void CreateToolBars(); // 创建工具栏
protected slots:
void NewFile(); // 新建文件
private:
...
simpletexteditor.cpp
Реализуйте функцию слота вNewFile
void SimpleTextEditor::NewFile()
{
SimpleTextEditor *newsimpleTextEditor = new SimpleTextEditor();
newsimpleTextEditor->show();
}
Добавить в действие SimpleTextEditor::CreateActions()
в функции新建
connect
...
// 新建
newFileAction = new QAction(QIcon(":/new"),tr("新建"),this);
newFileAction->setShortcut(tr("Ctrl+N"));
newFileAction->setStatusTip(tr("新建一个文件"));
connect(newFileAction,SIGNAL(triggered()),this,SLOT(NewFile()));
// 打印
...
открыть файл
QFileDialog
Откройте существующий файл. Если в центральной части текущего выпуска уже есть открытый файл, выбранный файл будет открыт в новом окне, если нет, то он будет открыт в текущем окне.
simpletexteditor.h
Добавьте функцию слота OpenFile
и функцию загрузки файла вLoadFile
...
protected slots:
void NewFile(); // 新建文件
void OpenFile(); // 打开文件
private:
void LoadFile(QString fileName); // 加载文件
private:
...
simpletexteditor.cpp
Реализовать функции слотов OpenFile
и функции загрузки файлов вLoadFile
void SimpleTextEditor::OpenFile()
{
fileName = QFileDialog::getOpenFileName(this,tr("Open file dialog"),tr("D:\\"));// 可以限制下文件类型
if(!fileName.isEmpty()){
// 判断当前中心部件是否已有文件打开
if(showWidget->text->document()->isEmpty()){
LoadFile(fileName); // 加载文件
} else {
// 新建加载
SimpleTextEditor *newsimpleTextEditor = new SimpleTextEditor();
newsimpleTextEditor->show();
newsimpleTextEditor->LoadFile(fileName);
}
}
}
void SimpleTextEditor::LoadFile(QString fileName)
{
qDebug() << tr("Load file : ") << fileName;
QFile file(fileName);
if(file.open(QIODevice::ReadOnly | QIODevice::Text)){
QTextStream textStream(&file);
// 注打开文本需要为 UTF-8
textStream.setCodec("UTF-8");//设置文件流编码方式, 否则可能会乱码
while(!textStream.atEnd()){
showWidget->text->append(textStream.readLine());
}
qDebug() << tr("Read file end");
}
}
Добавить в действие SimpleTextEditor::CreateActions()
в функции打开
connect
...
// 设置 状态栏显示 光标移动到这里时 状态栏显示同时
openFileAction->setStatusTip(tr("打开一个文件"));
connect(openFileAction,SIGNAL(triggered()),this,SLOT(OpenFile()));
// 新建
newFileAction = new QAction(QIcon(":/new"),tr("新建"),this);
...
печатать документы
Используйте стандартный диалог печати QPrintDialog
для реализации функции печати текста.
Примечание. Его необходимо добавить в файл проекта (.pro), QT+= printsupport
и он станетQT += core gui printsupport
simpletexteditor.h
Добавить функцию слота вPrintFile
...
protected slots:
void NewFile(); // 新建文件
void OpenFile(); // 打开文件
void PrintFile(); // 打印文件
private:
...
simpletexteditor.cpp
Реализуйте функцию слота вPrintFile
void SimpleTextEditor::LoadFile(QString fileName)
{
qDebug() << tr("Load file : ") << fileName;
QFile file(fileName);
if(file.open(QIODevice::ReadOnly | QIODevice::Text)){
QTextStream textStream(&file);
// 注打开文本需要为 UTF-8
textStream.setCodec("UTF-8");//设置文件流编码方式, 否则可能会乱码
while(!textStream.atEnd()){
showWidget->text->append(textStream.readLine());
}
qDebug() << tr("Read file end");
}
}
Добавить в действие SimpleTextEditor::CreateActions()
в функции打印
connect
...
// 打印
printFileAction = new QAction(QIcon(":/printText"),tr("打印文本"),this);
printFileAction->setStatusTip(tr("打印一个文本"));
connect(printFileAction,SIGNAL(triggered()),this,SLOT(PrintFile()));
...
функция редактирования текста
При написании программы редактирования текста, включая форматирование, часто используются классы Qt QTextEdit 、QTextDocument 、QTextBlock 、QTextList 、QTextFrame 、QTextTable 、QTextCharFormat 、QTextBlockFormat 、QTextListFormat 、QTextFrameFormat 和 QTextTableFormat
и так далее .
- Любая программа текстового редактора должна использовать
QTextEdit
в качестве контейнера для ввода текста QTextEdit
Редактируемый текст вQTextDocument
переноситсяQTextDocument
Различные элементы:QTextBolck 、QTextList 、QTextFrame
и т. д., которые могут быть выражены в виде строк, абзацев, списков, таблиц или изображений и т. д.- Каждый элемент имеет свой формат, и
QTextCharFormat 、QTextBlockFormat 、QTextListFormat 、QTextFrameFormat
эти описываются и реализуются такими классамиQTextBlockFormat
, как .УказываетQTextBlock
QTextBlock
QTextBlockFormat
QTextCursor
Класс используется для представления курсора в редактируемом тексте и предоставляет интерфейс для измененияQTextDocument
документа Все изменения формата документа связаны с курсором. Например, изменение формата символа на самом деле означает изменение формата символа в месте курсора. Другой пример: изменение формата абзаца на самом деле означает изменение формата абзаца, в котором находится курсор.
simpletexteditor.h
Добавьте функции слота и переменные в
protected slots:
...
void SetFontComboBox(QString comboStr); // 设置 字体
void SetSizeSpinBox(QString spinValue); // 设置 字号
void SetBoldBtn(); // 设置 加粗
void SetItalicBtn(); // 设置 斜体
void SetUnderlineBtn(); // 设置 下划线
void SetColorBtn(); // 设置 颜色
void ShowCurrentFormatChanged(const QTextCharFormat &fmt); // 根据光标处字体格式 变化刷新 工具上的显示
...
private:
...
// 文本编辑 字体相关设置
// 字体设置项
QLabel *fontLabel1;
QFontComboBox *fontComboBox;
// 字号
QLabel *fontLabel2;
QComboBox *sizeComboBox;
// 加粗 按钮
QToolButton *boldBtn;
// 斜体 按钮
QToolButton *italicBtn;
// 下划线 按钮
QToolButton *underlineBtn;
// 颜色 按钮
QToolButton *colorBtn;
// 字体工具栏
QToolBar *fontToolBar;
...
Добавленная в SimpleTextEditor::SimpleTextEditor
конструктор функция CreateFontToolBar
создает панель инструментов элемента шрифта редактирования текста.
...
CreateToolBars();
// 创建 文本编辑 字体项 工具栏
CreateFontToolBar();
...
добавить void SimpleTextEditor::CreateFontToolBar()
функцию
void SimpleTextEditor::CreateFontToolBar()
{
// 设置 字体
fontLabel1 =new QLabel(tr("字体:"));
fontComboBox =new QFontComboBox;
// 调用 QFontComboBox 的 setFontFilters 接口可过滤只在下拉列表框中显示某一类字体
// 默认情况下为 QFontComboBox::AllFonts 列出所有字体。
fontComboBox->setFontFilters(QFontComboBox::ScalableFonts); // ScalableFonts 显示可缩放字体
// 设置 字号
fontLabel2 =new QLabel(tr("字号:"));
sizeComboBox =new QComboBox;
QFontDatabase db; // QFontDatabase 表示系统所有可用的格式信息,主要是字体和字号
// standardSizes 返回可用标准字号列表
foreach(int size,db.standardSizes()){
sizeComboBox->addItem(QString::number(size));
}
// 设置 加粗
boldBtn =new QToolButton;
boldBtn->setIcon(QIcon(":/bold"));
boldBtn->setCheckable(true);
// 设置 斜体
italicBtn =new QToolButton;
italicBtn->setIcon(QIcon(":/italic"));
italicBtn->setCheckable(true);
// 设置 下划线
underlineBtn =new QToolButton;
underlineBtn->setIcon(QIcon(":/underline"));
underlineBtn->setCheckable(true);
// 设置 颜色
colorBtn =new QToolButton;
colorBtn->setIcon(QIcon(":/color"));
colorBtn->setCheckable(true);
// 事件关联
// 设置 字体
connect(fontComboBox,SIGNAL(activated(QString)),
this,SLOT(SetFontComboBox(QString)));
// 设置 字号
connect(sizeComboBox,SIGNAL(activated(QString)),
this,SLOT(SetSizeSpinBox(QString)));
// 设置 加粗
connect(boldBtn,SIGNAL(clicked()),this,SLOT(SetBoldBtn()));
// 设置 斜体
connect(italicBtn,SIGNAL(clicked()),this,SLOT(SetItalicBtn()));
// 设置 下划线
connect(underlineBtn,SIGNAL(clicked()),this,SLOT(SetUnderlineBtn()));
// 设置 颜色
connect(colorBtn,SIGNAL(clicked()),this,SLOT(SetColorBtn()));
// 根据光标处字体格式 变化刷新 工具上的显示
connect(showWidget->text,SIGNAL(currentCharFormatChanged(QTextCharFormat&)),this,SLOT(ShowCurrentFormatChanged(QTextCharFormat&)));
// 字体 工具条
fontToolBar =addToolBar("Font");
fontToolBar->addWidget(fontLabel1); // 设置 字体
fontToolBar->addWidget(fontComboBox);
fontToolBar->addWidget(fontLabel2); // 设置 字号
fontToolBar->addWidget(sizeComboBox);
fontToolBar->addSeparator();
fontToolBar->addWidget(boldBtn); // 设置 加粗
fontToolBar->addWidget(italicBtn); // 设置 斜体
fontToolBar->addWidget(underlineBtn); // 设置 下划线
fontToolBar->addSeparator();
fontToolBar->addWidget(colorBtn); // 设置 颜色
}
установить шрифт
simpletexteditor.cpp
Реализуйте функцию слота вSetFontComboBox
void SimpleTextEditor::SetFontComboBox(QString comboStr)
{
QTextCharFormat fmt;
fmt.setFontFamily(comboStr);
SetTextCharFormat(fmt);
}
simpletexteditor
В класс добавлена функция SetTextCharFormat
для применения форматирования к редактируемым текстовым векторам QTextEdit
в формате QTextDocument
.
функцияSimpleTextEditor::SetTextCharFormat
QTextDocument
Все модификации QTextCursor
выполняются через класс
void SimpleTextEditor::SetTextCharFormat(QTextCharFormat format)
{
// 获取 编辑框中的光标
QTextCursor cursor = showWidget->text->textCursor();
if(!cursor.hasSelection()){
// 判断是否有选择 区域
// 没有 就选取所在词作为选取 由前后 空格或, . 等标点符号区分词
cursor.select(QTextCursor::WordUnderCursor);
/*
enum SelectionType {
WordUnderCursor, // 选择光标下的单词。 如果光标不在可选字符的字符串中,则不选择文本。
LineUnderCursor, // 选择光标下的文本行。
BlockUnderCursor, // 选择光标下的文本块。
Document // 选择整个文档。
};
*/
}
cursor.mergeCharFormat(format); // 将格式应用到光标所在区域
showWidget->text->mergeCurrentCharFormat(format); // 将格式应用到cursor选区内所有字符上
}
установить размер шрифта
simpletexteditor.cpp
Реализуйте функцию слота вSetSizeSpinBox
void SimpleTextEditor::SetSizeSpinBox(QString spinValue)
{
QTextCharFormat fmt;
fmt.setFontPointSize(spinValue.toFloat());
showWidget->text->mergeCurrentCharFormat(fmt);
}
сделать текст жирным
simpletexteditor.cpp
Реализуйте функцию слота вSetBoldBtn
void SimpleTextEditor::SetBoldBtn()
{
QTextCharFormat fmt;
if(boldBtn->isChecked()){
fmt.setFontWeight(QFont::Bold);
} else {
fmt.setFontWeight(QFont::Normal);
}
showWidget->text->mergeCurrentCharFormat(fmt);
}
установить курсив текста
simpletexteditor.cpp
Реализуйте функцию слота вSetItalicBtn
void SimpleTextEditor::SetItalicBtn()
{
QTextCharFormat fmt;
fmt.setFontItalic(italicBtn->isChecked());
showWidget->text->mergeCurrentCharFormat(fmt);
}
установить подчеркивание текста
simpletexteditor.cpp
Реализуйте функцию слота вSetUnderlineBtn
void SimpleTextEditor::SetUnderlineBtn()
{
QTextCharFormat fmt;
fmt.setFontUnderline(underlineBtn->isChecked());
showWidget->text->mergeCurrentCharFormat(fmt);
}
установить цвет текста
simpletexteditor.cpp
Реализуйте функцию слота вSetColorBtn
void SimpleTextEditor::SetColorBtn()
{
QColor color = QColorDialog::getColor(Qt::red,this);
if(color.isValid()){
// 可用
QTextCharFormat fmt;
fmt.setForeground(color);
showWidget->text->mergeCurrentCharFormat(fmt);
}
}
Обновить информацию панели инструментов
simpletexteditor.cpp
Реализуйте функцию слота вShowCurrentFormatChanged
void SimpleTextEditor::ShowCurrentFormatChanged(const QTextCharFormat &fmt)
{
// 字体
fontComboBox->setCurrentIndex(fontComboBox->findText(fmt.fontFamily()));
// 字号
sizeComboBox->setCurrentIndex(sizeComboBox->findText(QString::number(fmt.fontPointSize())));
// 是否 加粗
boldBtn->setChecked(fmt.font().bold());
// 是否 斜体
italicBtn->setChecked(fmt.font().italic());
// 是否 下划线
underlineBtn->setChecked(fmt.font().underline());
}
Функция набора текста
[Не удалось передать изображение по внешней ссылке, исходный сайт может иметь механизм защиты от кражи ссылок, рекомендуется сохранить изображение и загрузить его напрямую (img-JyYZx18j-1682738319018) Метод сортировки / основа K_QT. Одна статья знакомит с редактированием текста и набором текста, включая настройки, связанные со шрифтом, выравнивание абзаца и sorting.gif)]
Вот введение в реализацию функции выравнивания текстового абзаца и расположения текста.
Выравнивание: по левому краю, по правому краю, по центру и по ширине
Расположение: один закрашенный круг, один открытый круг, один заполненный квадрат, восходящие десятичные значения, убывающие латинские буквы, восходящие латинские буквы, убывающие латинские буквы, восходящие латинские
буквы
simpletexteditor.h
Добавьте функции слота и переменные в
protected slots:
...
// 排版设置项
void SetAlignment (QAction *act); // 设置 段落对齐方式
void SetList(int index); // 设置排序
void ShowCursorPositionChanged(); // 光标位置发生变化 刷新 排版工具栏的显示
...
private:
...
// 排版设置项
// 文本排序 方式
QLabel *listLabel;
QComboBox *listComboBox;
// 文本段落对其方式
QActionGroup *actGrp;
QAction *leftAction; // 左对齐
QAction *rightAction; // 右对齐
QAction *centerAction; // 居中对齐
QAction *justifyAction; // 两端对齐
// 排版工具栏
QToolBar *listToolBar;
SimpleTextEditor::CreateActions()
Добавить действие к функции
void SimpleTextEditor::CreateActions()
{
...
//排序:左对齐、右对齐、居中和两端对齐
actGrp =new QActionGroup(this);
leftAction =new QAction(QIcon(":/left"),"左对齐",actGrp);
leftAction->setCheckable(true);
rightAction =new QAction(QIcon(":/right"),"右对齐",actGrp);
rightAction->setCheckable(true);
centerAction =new QAction(QIcon(":/center"),"居中",actGrp);
centerAction->setCheckable(true);
justifyAction =new QAction(QIcon(":/justify"),"两端对齐",actGrp);
justifyAction->setCheckable(true);
connect(actGrp,SIGNAL(triggered(QAction*)),this,SLOT(SetAlignment (QAction*)));
}
Добавлена в SimpleTextEditor::SimpleTextEditor
конструктор , CreateTypesettingToolbar
панель инструментов набора функций содержит выравнивание и сортировку
...
// 创建 排版 工具栏 对齐方式和排序方式
CreateTypesettingToolbar();
добавить void SimpleTextEditor::CreateTypesettingToolbar()
функцию
void SimpleTextEditor::CreateTypesettingToolbar()
{
listLabel = new QLabel(tr("排序"));
listComboBox = new QComboBox;
// 排序方式 列表 参见 QT帮助手册
listComboBox->addItem("Standard"); // 不设置
listComboBox->addItem("QTextListFormat::ListDisc"); // 一个实心圆圈
listComboBox->addItem("QTextListFormat::ListCircle"); // 一个空心圆圈
listComboBox->addItem("QTextListFormat::ListSquare"); // 一个实心正方形
listComboBox->addItem("QTextListFormat::ListDecimal"); // 按升序排列的十进制值
listComboBox->addItem("QTextListFormat::ListLowerAlpha"); // 按降序的拉丁字母
listComboBox->addItem("QTextListFormat::ListUpperAlpha"); // 按升序的拉丁字母
listComboBox->addItem("QTextListFormat::ListLowerRoman"); // 按降序的罗马字母
listComboBox->addItem("QTextListFormat::ListUpperRoman"); // 按升序的罗马字母
// 事件关联
// 设置列表
connect(listComboBox,SIGNAL(activated(int)),this,SLOT(SetList(int)));
// 光标位置发生变化 刷新 排版工具栏的显示, 例如 是否使能对齐按钮
connect(showWidget->text,SIGNAL(cursorPositionChanged()),
this,SLOT(ShowCursorPositionChanged()));
// 是否使能 undo redo 按钮
connect(showWidget->text->document(),SIGNAL(undoAvailable(bool)),
redoAction,SLOT(setEnabled(bool)));
connect(showWidget->text->document(),SIGNAL(redoAvailable(bool)),
redoAction,SLOT(setEnabled(bool)));
// 排版工具条
// 排列方式
listToolBar =addToolBar("list");
listToolBar->addWidget(listLabel);
listToolBar->addWidget(listComboBox);
listToolBar->addSeparator();
// 对齐方式
listToolBar->addActions(actGrp->actions());
}
выравнивание абзаца
setAlignment
Установите текущее выравнивание абзаца,
void SimpleTextEditor::SetAlignment(QAction *act)
{
// 通过 setAlignment 设置当前段落对齐方式
if(act==leftAction) {
// 左对齐
showWidget->text->setAlignment(Qt::AlignLeft);
}
if(act==rightAction) {
// 右对齐
showWidget->text->setAlignment(Qt::AlignRight);
}
if(act==centerAction) {
// 居中对齐
showWidget->text->setAlignment(Qt::AlignCenter);
}
if(act==justifyAction) {
// 两端对齐
showWidget->text->setAlignment(Qt::AlignJustify);
}
}
cursorPositionChanged
Обновлять отображение панели инструментов макета в ответ на изменение положения курсора
void SimpleTextEditor::ShowCursorPositionChanged()
{
if(showWidget->text->alignment()==Qt::AlignLeft) {
leftAction->setChecked(true);
}
if(showWidget->text->alignment()==Qt::AlignRight) {
rightAction->setChecked(true);
}
if(showWidget->text->alignment()==Qt::AlignCenter) {
centerAction->setChecked(true);
}
if(showWidget->text->alignment()==Qt::AlignJustify) {
justifyAction->setChecked(true);
}
}
сортировка текста
Используется для описания формата сортировки текста, QTextListFormat
содержит два основных атрибута: один QTextListFormat::style
указывает, какой метод сортировки принимает текст, другой указывает QTextListFormat::indent
значение отступа после сортировки. Поэтому для реализации функции сортировки текста нужно только установить QTextListFormat
два вышеуказанных свойства, и применить весь формат к тексту через QTextCursor
класс .
В обычных текстовых редакторах QTextListFormat
значение indent
отступа предустановлено и не требует установки пользователем. В этом примере в программе получают значение отступа QTextBlockFormat
текущего для выполнения соответствующих вычислений, чтобы получить значение отступа отсортированного текста.
SetList
Установить сортировку текста через
void SimpleTextEditor::SetList(int index)
{
//获得编辑框的QTextCursor对象指针
QTextCursor cursor=showWidget->text->textCursor();
if(index!=0) {
// 不是选择 Standard
QTextListFormat::Style style=QTextListFormat::ListDisc;
switch(index) {
//设置style属性值
case 1:{
style=QTextListFormat::ListDisc;
break;
}
case 2: {
style=QTextListFormat::ListCircle;
break;
}
case 3:{
style=QTextListFormat::ListSquare;
break;
}
case 4:{
style=QTextListFormat::ListDecimal;
break;
}
case 5:{
style=QTextListFormat::ListLowerAlpha;
break;
}
case 6:{
style=QTextListFormat::ListUpperAlpha;
break;
}
case 7:{
style=QTextListFormat::ListLowerRoman;
break;
}
case 8:{
style=QTextListFormat::ListUpperRoman;
break;
}
default:
break;
}
/* 设置缩进值 */
// beginEditBlock 和 endEditBlock 成对出现
cursor.beginEditBlock();
QTextBlockFormat blockFmt=cursor.blockFormat();
QTextListFormat listFmt;
if(cursor.currentList()) {
// 存在
listFmt = cursor.currentList()->format(); // 列表的格式
} else {
// 如果没有 则列表缩进值 + 1
listFmt.setIndent(blockFmt.indent()+1);
blockFmt.setIndent(0); //
cursor.setBlockFormat(blockFmt); // 设置块格式
}
listFmt.setStyle(style);
cursor.createList(listFmt);
cursor.endEditBlock();
} else {
QTextBlockFormat bfmt;
bfmt.setObjectIndex(0); // 设置格式对象的对象索引;
cursor.mergeBlockFormat(bfmt); // 合并当前块格式
}
}
Уведомление:
cursor.beginEditBlock();
…
cursor.endEditBlock();
Этот фрагмент кода QTextListFormat
завершает indent
настройку (то есть значения отступа) и применяет заданный формат к тексту, в котором находится курсор. Начните
с и закончите с помощью , роль этих двух функций состоит в том, чтобы установить все операции между этими двумя функциями как действие. Если требуется отмена или повтор, все операции между этими двумя функциями, которые обычно появляются парами, будут отменены или повторены одновременно.cursor.beginEditBlock()
cursor.endEditBlock()
Чтобы обновить отображение выпадающего меню сортировки на панели инструментов, ShowCursorPositionChanged
добавьте следующий код в функцию
void SimpleTextEditor::ShowCursorPositionChanged()
{
...
QTextListFormat listFmt;
QTextCursor cursor=showWidget->text->textCursor();
QString text = "Standard";
if(cursor.currentList()) {
// 存在
listFmt = cursor.currentList()->format(); // 列表的格式
QTextListFormat::Style style = listFmt.style();
switch(style) {
//设置style属性值
case QTextListFormat::ListDisc:{
text = "QTextListFormat::ListDisc";
break;
}
case QTextListFormat::ListCircle: {
text = "QTextListFormat::ListCircle";
break;
}
case QTextListFormat::ListSquare:{
text = "QTextListFormat::ListSquare";
break;
}
case QTextListFormat::ListDecimal:{
text = "QTextListFormat::ListDecimal";
break;
}
case QTextListFormat::ListLowerAlpha:{
text = "QTextListFormat::ListLowerAlpha";
break;
}
case QTextListFormat::ListUpperAlpha:{
text = "QTextListFormat::ListUpperAlpha";
break;
}
case QTextListFormat::ListLowerRoman:{
text = "QTextListFormat::ListLowerRoman";
break;
}
case QTextListFormat::ListUpperRoman:{
text = "QTextListFormat::ListUpperRoman";
break;
}
default:
text = "Standard";
break;
}
}
listComboBox->setCurrentIndex(listComboBox->findText(text));
}
добавлена основная функция
QFont f("楷体",12); //设置显示的字体格式
a.setFont(f);