Редактирование текста 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 , как .УказываетQTextBlockQTextBlockQTextBlockFormat
  • 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);

Guess you like

Origin blog.csdn.net/m0_45463480/article/details/130439165