二十二、QT记事本

**1.**项目概述

1.1****功能介绍

支持文本创建,打开,保存,关闭的功能

UI样式美化

添加打开快捷键,添加保存快捷

底部显示行列号及文本字符编码

Ctrl加鼠标滚轮支持字体放大缩小

1.2****界面预览

2.3****工程概述

MainWindows还是Widget

在Qt中,创建 "MainWindow" 与 "Widget" 项目的主要区别在于他们的用途和功能范围:

  1. MainWindow:这是一个包含完整菜单栏、工具栏和状态栏的主窗口应用程序框架。它适合于更复杂的应用程序,需要这些额外的用户界面元素来提供丰富的功能和交互。

  2. Widget:这通常是一个简单的窗口,没有内置的菜单栏、工具栏或状态栏。它适合于更简单或专用的应用程序,不需要复杂的用户界面组件。

简而言之,选择"MainWindow"或"Widget"取决于你的应用程序需要多少内置的用户界面元素和复杂性。 MainWindow提供了更全面的框架,而Widget则更适合简单、专注的界面。


Source------mian.cpp:

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

Widget w;

w.show();

return a.exec();

}

QApplication a(argc, argv);

在Qt应用程序中, QApplication a(argc, argv); 这行代码的作用是创建一个 QApplication 类的

实例。这是几乎每个Qt应用程序必须做的第一步,因为它负责管理应用程序的许多核心功能。

下表总结了 QApplication 类在Qt框架中的主要功能和职责:

QApplication 是Qt应用程序的核心,它为应用程序提供了必要的环境和框架,确保GUI组件能够正常工作并响应用户的操作。

简而言之, QApplication a(argc, argv); 用于初始化Qt应用程序的环境,设置事件循环,并准备应 用程序处理GUI事件。

return a.exec();

在Qt应用程序中, QApplication::exec() 函数是用来启动应用程序的事件循环 的。当你调用这个函数时,它会开始处理和分发事件,如用户的点击、键盘输入等。这个函数会一直运行,直到事件循环结束,通常是因为调用了 QApplication::quit() 函数或者关闭了应用程序的主窗口。简而言之,exec() 是****Qt程序中的主循环,负责监听和响应事件,保持应用程序运行直到用户决定退出。


Source------widget.cpp:

#include "widget.h"

#include "ui_widget.h"

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)

{

ui->setupUi(this);

}

Widget::~Widget()

{

delete ui;

}

Widget::Widget(QWidget *parent) : QWidget(parent),ui(new Ui::Widget)

QWidget(parent) 是初始化列表,用于调用基类 QWidget 的构造函数,并将 parent 传递给它。 ui(new Ui::Widget) 是初始化类内部的 ui 成员变量,这是通过 new 关键字动态分配的。

Ui::Widget 是由Qt Designer工具生成的,用于处理用户界面。这种方式允许将用户界面的设计与后端逻辑代码分离,有助于提高代码的可维护性和可读性。


Headers------widget.h:

#ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE

namespace Ui { class Widget; }

QT_END_NAMESPACE

class Widget : public QWidget

{

Q_OBJECT

public:

Widget(QWidget *parent = nullptr);

~Widget();

private:

Ui::Widget *ui;

};

#endif // WIDGET_H

namespace Ui { class Widget; }

在Qt框架中, namespace Ui { class Widget; } 是一种常见的用法,通常出现在使用Qt Designer设 计GUI时自动生成的代码中。这里的 Ui 是一个命名空间,而 class Widget 是一个前向声明,它声明了一个名为 Widget 的类。这种做法允许在 .cpp 源文件中引用由Qt Designer创建的UI界面,而不需要在头文件中包含完整的UI类定义。这种分离的方法有助于减少编译依赖性并保持代码的清晰和组织。

在你的源文件中,你会创建一个 Ui::Widget 类型的对象来访问和操作UI组件。

QT_BEGIN_NAMESPACE & QT_END_NAMESPACE

QT_BEGIN_NAMESPACE 是Qt框架中用于支持命名空间的宏定义。Qt使用这些宏来确保其库中的类和函数不会与其他库中的同名类和函数冲突。 QT_BEGIN_NAMESPACE 宏在定义Qt类和函数之前使用,用来指定接下来的代码位于Qt的命名空间中。它通常与 QT_END_NAMESPACE 配对使用,后者标志着命名空间的结束。这种机制对于在大型项目中维护代码的清晰度和防止命名冲突非常重要。

Q_OBJECT

Q_OBJECT 宏是Qt框架中一个非常重要的宏,用于启用Qt对象的元对象系统。当你在Qt中定义一个类时,如果这个类继承自 QObject****或其子类,并且你想使用Qt的信号和槽机制、国际化、属性系统或其他Qt元对象系统提供的功能,就必须在类定义中包含 Q_OBJECT 宏(Widget继承于QObject的子类QWidget)。

这个宏允许Qt的元对象编译器(moc)识别并处理这个类,生成额外的代码,这些代码是实现信号和槽机制以及其他元对象功能所必需的。简单地说, Q_OBJECT 宏为Qt类提供了额外的元数据,使得类能够完全利用Qt框架的功能。

2. UI****设计工具

2.1按键QPushButton

美化按键------help搜索stylesheet

右键按键------改变样式表

添加QPushButton { color: red; background-color: white }------就能将字体颜色改为红色,背景颜色改为白色

添加QRaidoButton:hover { color: red }------悬停时字体颜色为红色

添加QPushButton:pressed { color:red }------按下按键时字体颜色为红色

(若hover或pressed前有!表示未悬停和未按下)

但是若要将按键美化成图片:

右键.pro文件------在Explorer中显示------将带有图片的文件夹复制进来

右键该项目------Add new

QT------Qt Resource File

起名为res------添加icon中的所有图片文件

在Widget的windowIcon选择资源,添加图片

修改windowTitle为ChenZhuoNoteBook

改变按键样式表------添加资源------border-image

添加所需图片------添加之后稍事修改其大小

2.2水平布局QHBoxLayout

2.3垂直布局QVBoxLayout

2.4文本编辑器TextEdit

整个Widget(widgetbottom,widgetbutton,textEdit)采用垂直布局

widgetbottom和widgetbutton之中的控件采用水平布局

2.5****主窗体元素设计

在Widget.cpp的Widget::Widget(QWidget *parent) : QWidget(parent),ui(new Ui::Widget)中添加

ui->setupUi(this);

//虽然上面一行代码进行widget和ui的窗口关联,但是如果发生窗口大小变化时,里面的布局不会随之变化

//下面一行代码的意思是:当窗口Widget大小变化时,布局verticalLayoutAll及其子控件随之调整

this->setLayout(ui->verticalLayoutAll);

//下面一行代码的意思是:当底窗口widgetbottom大小变化时,布局horizontalLayoutBottom及其子控件也随之调整

ui->widgetbottom->setLayout(ui->horizontalLayoutBottom);

**3.按键响应-**初识信号与槽

3.1****信号与槽基本介绍

提出疑问,界面上已经有按键了,怎么操作才能让用户按下按键后有操作上的反应呢?

在 Qt 中,信号和槽机制是一种非常强大的事件通信机制。

  1. 信号**(Signals)**:是由对象在特定事件发生时发出的消息。例如, QPushButton 有一个clicked() 信号,当用户点击按钮时发出。

  2. **(Slots)**:是用来响应信号的方法。一个槽可以是任何函数,当其关联的信号被发出时,该槽函数将被调用。

  3. 连接信号和槽:使用 QObject::connect() 方法将信号连接到槽。当信号发出时,关联的槽函数会自动执行。

3.2按键QPushButton****设置信号与槽

Qt的信号和槽机制是其事件处理系统的核心。这种机制允许对象之间的通信,而不需要它们知道对方的具体实现。

有四种Qt信号和槽的常见连接方式

例如:设置四个按键------右键------转到槽------clicked()

4.文件操作类QFile

QFile 是 Qt 框架中用于文件处理的一个类。它提供了读取和写入文件的功能,支持文本和二进制文件。

QFile 继承自 QIODevice ,因此它可以像其他IO设备一样使用。

主要功能

  1. 文件读写: QFile 支持打开文件进行读取或写入操作。

  2. 文件信息:可以检索有关文件的信息,如大小、修改日期等。

  3. 文件操作:提供了对文件进行重命名、移动、删除等操作的能力。

  4. 错误处理: QFile 在操作文件时提供了错误处理机制,可以通过相应的函数检查和获取错误息。

常用方法

open() :打开一个文件。需要指定模式(如只读、只写、读写等)。

close() :关闭文件。

read() 和 write() :用于读取和写入数据。

exists() :检查文件是否存在。

remove() :删除文件。

copy() :复制文件。

5. QTextStream

QTextStream 的主要特性:

例如:设置四个按键------右键------转到槽------clicked()

Widget.cpp:

cpp 复制代码
//QFile读取文件
void Widget::on_btnread_clicked()
{
    //1.打开文件
    //方式一:
    QFile file("F:/shangguan/QT/QT_test/35-QFile/test.txt");
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    //2.读取文件内容
    char text[100] = {"\0"};
    if(file.read(text,100) == -1)  return;
    //3.输出文件内容
    qDebug() << text;
    //4.关闭文件
    file.close();
}

//QFile创建并写入内容到文件
void Widget::on_btnwrite_clicked()
{
    //1.创建文件
    //方式二:
    QFile file;
    file.setFileName("F:/shangguan/QT/QT_test/35-QFile/test111.txt");
    file.open(QIODevice::WriteOnly | QIODevice::Text);
    //2.写内容到文件
    file.write("我是辰卓");
    //3.关闭文件
    file.close();
}

//QTextStream读文件
void Widget::on_btnstrread_clicked()
{
    //1.打开文件
    QFile file("F:/shangguan/QT/QT_test/35-QFile/test.txt");
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    //2.读取并输出文件内容
    QTextStream in(&file);
    in.setCodec("UTF-8");
    while(!in.atEnd())
    {
        QString context = in.readLine();
        qDebug() << context ;
    }
    //3.关闭文件
    file.close();
}


//QTextStream写文件
void Widget::on_btnstrwrite_clicked()
{
    //1.创建文件
    QFile file("F:/shangguan/QT/QT_test/35-QFile/test222.txt");
    file.open(QIODevice::WriteOnly | QIODevice::Text);
    //2.写内容到文件
    QTextStream out(&file);
    out.setCodec("UTF-8");
    out << "I am chenzhuo.";
    //3.关闭文件
    file.close();
}

6.文件选择对话框QFileDialog

例如:设置三个按键------右键------转到槽------clicked()

cpp 复制代码
//QFileDialog文件选择框------在选择框里打开文件
void Widget::on_btnQFileDialog_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
                                                     "F:/shangguan/QT/QT_test/36-QFileDialog",
                                                     tr("Text (*.txt)"));
    qDebug() << fileName;

    //1.打开文件
    QFile file(fileName);
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    //2.读取并输出文件内容
    QTextStream in(&file);
    in.setCodec("UTF-8");
    while(!in.atEnd())
    {
        QString context = in.readLine();
        qDebug() << context;
    }
    //3.关闭文件
    file.close();
}


//QFileDialog选择多个文件
void Widget::on_btnse_clicked()
{
    QFileDialog dialog;//实例化
    dialog.setFileMode(QFileDialog::ExistingFiles);//设置模式:根据需要设置对话框的模式,如打开文件、保存文件等。
    dialog.setNameFilter("*.txt");//设置过滤器:如果需要,可以设置文件类型过滤器,以限制用户可以选择的文件类型。
    dialog.exec();//显示对话框:通过调用 exec() 方法显示对话框,并在用户作出选择后执行相应的操作。
    QStringList qstrings = dialog.selectedFiles();
    for(QString str : qstrings)
    {
        qDebug() << str;
    }
}


//QFileDialog保存文件
void Widget::on_btnsave_clicked()
{
    QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),
                                "F:/shangguan/QT/QT_test/36-QFileDialog/filename.txt",
                                tr("Text (*.txt *.doc)"));
    qDebug() << fileName;
    //1.打开文件
    QFile file(fileName);
    file.open(QIODevice::WriteOnly | QIODevice::Text);
    //2.写内容到文件
    QTextStream out(&file);
    out.setCodec("UTF-8");
    out << "QFileDialog write data to the txt file";
    //3.关闭文件
    file.close();
}

7. QComboBox

QComboBox 是 Qt 框架中用于创建下拉列表的一个控件。

它允许用户从一组选项中选择一个选项,并可以配置为可编辑,使用户能够在其中输入文本。

QComboBox 提供了一系列方法来添加、删除和修改列表中的项,支持通过索引或文本检索项,并可以通过信号和槽机制来响应用户的选择变化。该控件广泛应用于需要从多个选项中进行选择的用户界面场景,例如表单和设置界面。

例如:设置一个按键------右键------编辑项目------添加常用的字符编码

**8.**设置当前行高亮

实现策略:

获取当前行的光标位置,使用的信号和获取行列值是一样的

通过ExtraSelection来配置相关属性

在当前行设置该属性

实现该功能,需要用到一个API

QList<QTextEdit::ExtraSelection> extraSelections;

void setExtraSelections(const QList<QTextEdit::ExtraSelection> &extraSelections)

8.1 QList

在 Qt 框架中, QList 是一个容器类,它在内部实现上类似于一个数组,但也提供了一些链表的特性。

QList 的设计旨在提供一个在多数情况下既高效又方便的通用列表容器。用于存储元素列表。它提供了

丰富的功能,包括添加、移除、访问元素等。

QList 的内部工作原理:

  1. 数组式存储: QList 在大多数情况下使用连续内存存储其元素,类似于数组。这意味着它提供了快速的索引访问(通过下标操作符 [] ),以及相对高效的迭代性能。

  2. 动态调整大小:与静态数组不同, QList 可以动态增长和缩减,自动管理内存分配。

  3. 链表特性:虽然 QList 主要基于数组,但它也提供了一些链表的操作,比如在列表的开始或结束

处添加和移除元素。这些操作通常比在数组中间插入或删除元素更高效。

  1. 复制时共享内存: QList 使用一种称为"隐式共享"(implicit sharing)或"写时复制"(copy-on

write)的技术。这意味着当你复制一个 QList 时,它不会立即复制所有元素,而是共享相同的数

据,直到你尝试修改其中一个列表,此时才进行实际的复制。这使得复制 QList 变得非常高效。

使用场景:

当你需要快速的随机访问(如通过索引访问元素)时, QList 是一个不错的选择。

如果你的主要操作是在列表的两端添加或移除元素, QList 也表现得很好。

8.2 ExtraSelection****简介

QTextEdit::ExtraSelection 是一个在 QTextEdit 中用来表示额外的文本选择和高亮的结构。

如何工作

  1. ExtraSelection 结构体: QTextEdit::ExtraSelection 是一个结构体,包含了两个主要成员: QTextCursor 和 QTextCharFormat 。 QTextCursor 表示在文本中的一个位置或者区间,而 QTextCharFormat 用于定义这个区间的格式,比如背景颜色、字体等。

  2. 设置 ExtraSelection:你可以创建一个或多个 ExtraSelection 对象,为它们设置相应的光标位置和格式,然后通过 QTextEdit 的 setExtraSelections 方法将这些对象应用到文本编辑器中。这样,你可以对文本的特定部分应用特定的格式,而不影响其他文本。

  3. 高亮当前行:要高亮显示当前行,你需要在 cursorPositionChanged() 信号的槽函数中创建一个 ExtraSelection 对象。使用当前的 QTextCursor 对象(通过 textCursor() 方法获取)来确定当前行的位置,并设置背景颜色为你选择的高亮颜色。

QTextCharFormat 类是 Qt 框架中的一部分,用于描述文本字符的格式。这个类提供了丰富的接口来设置和获取文本字符的各种属性,如字体、颜色、背景色等。 QTextCharFormat 通常用于富文本处理,可以在像 QTextEdit 和 QTextDocument 这样的类中使用

9.消息对话框QMessageBox

QMessageBox 是 Qt 框架中用于显示消息框的一个类,它常用于向用户显示信息、询问问题或者报告错误。以下是 QMessageBox 的一些主要用途:

  1. 显示信息:向用户显示一些信息性的消息。

  2. 询问用户决策:询问用户一个问题,并根据其回答做出相应的操作。

  3. 报告错误:向用户报告程序运行中的错误。

**10.**快捷键开发基础

在 Qt 中实现快捷键功能通常涉及到 QShortcut 类的使用。下面是一个简单的代码示例,展示了如何在Qt 应用程序中为特定功能设置快捷键:

// 创建一个快捷键 (Ctrl + N) 并关联到窗口

QShortcut *shortcut = new QShortcut(QKeySequence("Ctrl+N"), &window);

// 当快捷键被按下时,显示一个消息框

QObject::connect(shortcut, &QShortcut::activated, [&]()

{

QMessageBox::information(&window, "Shortcut Activated", "Ctrl+N was pressed");

});

在这个示例中,当用户按下 Ctrl + N 时,程序将弹出一个消息框。这是通过创建一个 QShortcut 对象,并将其快捷键序列设置为 "Ctrl+N" 来实现的。然后,将 activated 信号连接到一个 Lambda 函数,该函数在快捷键被激活时执行。这种方法非常适用于为特定操作提供快速访问路径。

11. 事件方式实现字体放大缩小

众所周知Qt是一个基于C++的框架,主要用来开发带窗口的应用程序(不带窗口的也行,但不是主流)。我们使用的基于窗口的应用程序都是基于事件,其目的主要是用来实现回调(因为只有这样程序的效率才是最高的)。所以在Qt框架内部为我们提供了一些列的事件处理机制,当窗口事件产生之后,事件会经过: 事件派发**-> 事件过滤->事件分发->** 事件处理几个阶段。Qt窗口中对于产生的一系列事件都有默认的处理动作,如果我们有特殊需求就需要在合适的阶段重写事件的处理动作,比如信号与槽就是一种

事件(event)是由系统或者 Qt 本身在不同的场景下发出的。当用户按下/移动鼠标、敲下键盘,或者是窗口关闭/大小发生变化/隐藏或显示都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如鼠标/键盘事件等;另一些事件则是由系统自动发出,如计时器事件。

自定义控件MyTextEdit:

右键项目文件------Add New------C++------C++ class

mytextedit.h:

mytextedit.cpp:

将textEdit控件提升为MyTextEdit


12. 至此QT记事本所有功能均已搞定

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //虽然上面一行代码进行widget和ui的窗口关联,但是如果发生窗口大小变化时,里面的布局不会随之变化
    //下面一行代码的意思是:当窗口Widget大小变化时,布局verticalLayoutAll及其子控件随之调整
    this->setLayout(ui->verticalLayoutAll);
    //下面一行代码的意思是:当底窗口widgetbottom大小变化时,布局horizontalLayoutBottom及其子控件也随之调整
    ui->widgetbottom->setLayout(ui->horizontalLayoutBottom);

    //1. 在Widget的构造函数中关联信号与槽,检测用户选择条目的信号。
    connect(ui->comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(onCurrentIndexChanged(int)));

    //2. 在Widget的构造函数中添加信号与槽
    connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(onCursorPositionChanged()));

    // 制作两个快捷键用来保存和打开文件
    QShortcut *shortcutOpen = new QShortcut(QKeySequence(tr("Ctrl+O", "File|Open")),this);
    QShortcut *shortcutSave = new QShortcut(QKeySequence(tr("Ctrl+S", "File|Open")),this);

    // 把Ctrl+O的信号添加槽,调用打开按键的槽函数
    connect(shortcutOpen, &QShortcut::activated, [&]()
    {
        on_btnOpen_clicked();
    });
    // 把Ctrl+S的信号添加槽,调用保存按键的槽函数
    connect(shortcutSave, &QShortcut::activated, [&]()
    {
        on_btnSave_clicked();
    });

    // 制作两个快捷键用来放和缩小字体
    QShortcut *shortcutZoomIn =  new QShortcut(QKeySequence(tr("Ctrl+Shift+=","File|Save")),this);
    QShortcut *shortcutZoomOut = new QShortcut(QKeySequence(tr("Ctrl+Shift+-","File|Save")),this);

    // 把Ctrl+Shift+=的信号添加槽,调用放大字体的槽函数
    connect(shortcutZoomIn,&QShortcut::activated,[=]()
    {
        zoomIn();
    });
    // 把Ctrl+Shift+-的信号添加槽,调用缩小字体的槽函数
    connect(shortcutZoomOut,&QShortcut::activated,[=]()
    {
        zoomOut();
    });
}

按下打开按键:

cpp 复制代码
void Widget::on_btnOpen_clicked()
{
    //使用文件对话框获取要打开的文件的路径
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
                                                    "F:/shangguan/QT/QT_test/33-noteBook",
                                                    tr("Text (*.txt)"));
    //clear------每次打开文本之前,清空前一次打开的文本编辑器的内容
    ui->textEdit->clear();
    //1.打开文件
    //设置 QFile 对象的文件名
    file.setFileName(fileName);
    //以只读和文本模式打开文件
    file.open(QIODevice::ReadWrite | QIODevice::Text);
    //文件打开之后标题显示------文件名-ChenZhuoNoteBook
    this->setWindowTitle(fileName+"-ChenZhuoNoteBook");
    //2.读取并输出文件内容到textEdit
    //创建 QTextStream 用于读取文件内容
    QTextStream in(&file);
    //从下拉框获取当前选中的字符编码
    QString str = ui->comboBox->currentText();
    //将 QString 转化为 char* 类型
    const char *c_str = str.toStdString().c_str();
    //上述可以合在一起写成:const char *c_str = ui->comboBox->currentText().toStdString().c_str();
    //设置 QTextStream 的字符编码
    in.setCodec(c_str);
    //循环读取文件直到结束
    while(!in.atEnd())
    {
        //读取文件的一行
        QString context = in.readLine();
        //ui->textEdit->setText(context);//setText------每读一行,会覆盖前一行,只能读取一行
        //将读取的内容追加到文本编辑器
        ui->textEdit->append(context); //append------表示追加到文本末
    }
}

按下保存按键:

cpp 复制代码
void Widget::on_btnSave_clicked()
{
    if(!file.isOpen())
    {
        QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),
                                                        "F:/shangguan/QT/QT_test/33-noteBook/filename.txt",
                                                        tr("Text (*.txt *.doc)"));

        //1.打开文件
        file.setFileName(fileName);
        file.open(QIODevice::WriteOnly | QIODevice::Text);
        //文件打开之后标题显示------文件名-ChenZhuoNoteBook
        this->setWindowTitle(fileName+"-ChenZhuoNoteBook");
    }
    //2.写内容到文件
    QTextStream out(&file);
    out.setCodec(ui->comboBox->currentText().toStdString().c_str());
    QString context = ui->textEdit->toPlainText();//toPlainText------以纯文本形式返回文本编辑的文本
    file.seek(0);
    out << context;
}

按下关闭按键:

cpp 复制代码
void Widget::on_btnClose_clicked()
{
    int ret = QMessageBox:: information(this, tr("chenzhuo NoteBook"),
                                        tr("The document has been modified.\n"
                                           "Do you want to save your changes?"),
                                        QMessageBox::Save | QMessageBox::Discard
                                        | QMessageBox::Cancel,
                                        QMessageBox::Save);
    switch (ret) {
    case QMessageBox::Save:
        on_btnSave_clicked();
        break;
    case QMessageBox::Discard:
        ui->textEdit->clear();//并清空上一次打开的文本内容
        if(file.isOpen())
        {
            file.close();//文件被打开的情况下,点击btnClose后,关闭文件
            this->setWindowTitle("ChenZhuoNoteBook");//关闭之后标题显示------辰卓记事本
        }
        break;
    case QMessageBox::Cancel:
        //相当于用户误触
        break;
    default:
        // should never be reached
        break;
    }
}
  1. 添加槽函数,当用户选择信号后被调用,判断是否当前有打开的文件,如果有,则重新用新的编码读取文件并重新显示
cpp 复制代码
//onCurrentIndexChanged 方法:当 QComboBox 的选中项变化时执行
void Widget::onCurrentIndexChanged(int index)
{
    ui->comboBox->currentText();
        //清空文本编辑器的内容
    ui->textEdit->clear();
        //检查文件是否已经打开
    if(file.isOpen())
    {
            //创建 QTextStream 用于读取文件内容
        QTextStream in(&file);
            //设置 QTextStream 的字符编码为 QComboBox 当前选中的编码
        in.setCodec(ui->comboBox->currentText().toStdString().c_str());
            //将文件指针移动到文件开始位置
        file.seek(0);
            //循环读取文件直到文件结束
        while(!in.atEnd())
        {
                //读取文件的一行
            QString context = in.readLine();
                //将读取的内容追加到文本编辑器
            ui->textEdit->append(context);
        }
    }
    //为了不显示警告加上以下这两行:
    //qDebug() << index;
    //qDebug() << ui->comboBox->currentText();
}
  1. 添加槽函数获取textEdit的行列并显示到QLabel上
cpp 复制代码
void Widget::onCursorPositionChanged()
{
    QTextCursor cursor = ui->textEdit->textCursor();
    QString blockNum = QString::number(cursor.blockNumber()+1);
    QString columnNum = QString::number(cursor.columnNumber()+1);
    const QString labelMes = "L:"+blockNum+",C:"+columnNum+" ";
    ui->labelPosition->setText(labelMes);
    //设置当前行高亮
    QList<QTextEdit::ExtraSelection> extraSelections;
    QTextEdit::ExtraSelection ext;
    //1.知道当前行
    ext.cursor = ui->textEdit->textCursor();
    //2.颜色
    QBrush qBrush(Qt::cyan);
    ext.format.setBackground(qBrush);
    ext.format.setProperty(QTextFormat::FullWidthSelection,true);
    //3.设置
    extraSelections.append(ext);
    ui->textEdit->setExtraSelections(extraSelections);
}

放大和缩小字体的槽函数

cpp 复制代码
void Widget::zoomIn()
{
    //获得TextEdit的当前字体信息
    QFont font = ui->textEdit->font();
    //获得当前字体的大小
    int fontSize = font.pointSize();
    if(fontSize == -1) return;
    //改变大小,并设置字体大小
    int newFontSize = fontSize+1;
    font.setPointSize(newFontSize);
    ui->textEdit->setFont(font);
}
void Widget::zoomOut()
{
    //获得TextEdit的当前字体信息
    QFont font = ui->textEdit->font();
    //获得当前字体的大小
    int fontSize = font.pointSize();
    if(fontSize == -1) return;
    //改变大小,并设置字体大小
    int newFontSize = fontSize-1;
    font.setPointSize(newFontSize);
    ui->textEdit->setFont(font);
}
相关推荐
lsx2024062 小时前
Matplotlib 直方图:数据可视化基础
开发语言
可喜~可乐2 小时前
CAN总线入门指南:从原理到实践
c++·stm32·单片机·硬件工程
小馋喵知识杂货铺2 小时前
pytest 截图功能
开发语言·python
数维学长9862 小时前
C++ STL 中的 vector 总结
开发语言·c++
7yewh3 小时前
【LeetCode】力扣刷题热题100道(26-30题)附源码 轮转数组 乘积 矩阵 螺旋矩阵 旋转图像(C++)
c语言·数据结构·c++·算法·leetcode·哈希算法·散列表
kevin_tech3 小时前
Go 项目开发实战-用户Token的刷新、踢人下线和防盗检测
运维·服务器·开发语言·后端·golang
DevOpsDojo3 小时前
PHP语言的函数实现
开发语言·后端·golang
白鹭float.5 小时前
【OpenGL/C++】面向对象扩展——测试环境
c++·图形学·opengl
小wanga5 小时前
【C++】类型转换
jvm·c++
我不是程序猿儿5 小时前
【C++】xml烧录 调用twinCat流程自动化
xml·c++·自动化