一天教会你《如何使用QT从0开始完成自己的记事本程序编写》

一、准备工作

        1、软件方面:准备一个 Qt Creator 软件。
        2、网站:iconfont-阿里巴巴矢量图标库,从这个网站里可以获取到你需要的图标。
        3、硬件:准备一台电脑。
        4、准备好空空的大脑,准备接收新的知识。

每日QT查询表icon-default.png?t=O83Ahttps://mp.csdn.net/mp_blog/creation/editor/141787249

二、构思自己想要的记事本样式

1、我以自己电脑自带的记事本为例,简单的描述一下所需要的功能

        ①文件打开功能
        ②文件保存功能
        ③文件读取功能
        ④判断当前光标处于位置
        ⑤文件编码格式

三、UI界面设计

        1、基础控件设计

如何使用QT完成记事本程序的UI界面布局-CSDN博客文章浏览阅读97次。①水平和垂直布局②按键③文本框④水平弹簧⑤标签⑥Widget。https://blog.csdn.net/weixin_54210362/article/details/142026745?spm=1001.2014.3001.5501

          2、引用图片美化UI

Day-07-QT中如何引入图片替换控件-CSDN博客文章浏览阅读173次。想要做出一个炫酷的界面,必须要掌握引入图片替换控件的小技能https://blog.csdn.net/weixin_54210362/article/details/141999373?spm=1001.2014.3001.5502

          3、最终UI界面展示

四、功能设计

        1、UI界面运行优化

                1.1 存在问题

                1.2 解决方法

在wiget.cpp文件下加入以下划线代码

this->setLayout(ui->verticalLayout);

        2、 引入信号与槽设计打开,保存,关闭功能

Day-02-QPushButton设置信号与槽一在UI界面直接设置槽函数_qpushbuttong设置下凹-CSDN博客文章浏览阅读239次。1.点击UI界面2.选择Push Button按键3.右键选择转到槽4.根据自己的需要选择信号事件5.在自动生成的函数内编写自己需要完成的动作_qpushbuttong设置下凹https://blog.csdn.net/weixin_54210362/article/details/141813410?spm=1001.2014.3001.5501

               2.1 文件打开功能

                        2.1.1 代码展示

                         2.1.2 源码
// 弹出文件选择对话框
        fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("Text Files (*.txt *.doc);;All Files (*)"));

        if (!fileName.isEmpty()) {
            qDebug() << "Selected file:" << fileName;

            // 设置文件名
            file.setFileName(fileName);

            // 打开文件并读取内容
            if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
                qDebug() << "Failed to open file:" << fileName;
                return;
            }

            // 设置QTextStream使用的字符编码
            QTextStream in(&file);
            in.setCodec("UTF-8");  // 默认使用UTF-8编码,可以根据需要更改

            // 清空textEdit的内容
            ui->textEdit->clear();

            // 将文件指针移至文件开头
            file.seek(0);

            // 读取文件内容并显示在textEdit上
            while (!in.atEnd()) {
                QString line = in.readLine();
                ui->textEdit->append(line);
            }

            // 关闭文件
            file.close();
        } else {
            qDebug() << "No file selected or operation cancelled by user.";
        }

         2.2 文件保存功能

                 2.2.1 代码展示

                 2.2.2 源码
void Widget::on_saveButton_clicked()
{
    // 打开文件保存对话框
        QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "", tr("Text Files (*.txt);;All Files (*)"));

        if (fileName.isEmpty()) {
            return;
        }

        // 尝试打开文件
        QFile file(fileName);
        if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
            QMessageBox::warning(this, tr("Warning"), tr("Cannot open file for writing: %1").arg(file.errorString()));
            return;
        }

        // 使用 QTextStream 来写入文件内容
        QTextStream out(&file);
        out << ui->textEdit->toPlainText();

        // 关闭文件
        file.close();
}

 2.3 文件关闭功能

                 2.3.1 代码展示

                 2.3.2 源码
void Widget::on_closeButton_clicked()
{
    QMessageBox msgBox;
    QFile file;

    int ret = QMessageBox::warning(this, tr("MyNoteBook Notice:"),
                                   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_saveButton_clicked();
        qDebug() << "QMessageBox::Save:";
        break;
    case QMessageBox::Discard:
        // 不保存被点击
        ui->textEdit->clear();
        if (file.isOpen()) {
            file.close();
            this->setWindowTitle("MyNoteBook");
        }
        qDebug() << "QMessageBox::Discard:";
        break;
    case QMessageBox::Cancel:
        // 取消被点击
        qDebug() << "QMessageBox::Cancel:";
        break;
    default:
        // 不应该到达这里
        break;
    }
}

3、快捷键实现字体大小变化

   3.1 快捷键关联

                3.1.1 代码展示

                3.1.2 源码
void Widget::on_increaseFontSize()
{
    // 获取当前字体大小
    QFont font = ui->textEdit->font();
    int fontSize = font.pointSize();

    // 增加字体大小
    font.setPointSize(fontSize + 2);

    // 应用新字体
    ui->textEdit->setFont(font);
}

        3.2 字体变大

                3.2.1 代码展示

                3.2.2 源码
       QShortcut *increaseFontSizeShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Plus), this);//绑定了“Ctrl++”为字体变大
       connect(increaseFontSizeShortcut, &QShortcut::activated, this, &Widget::on_increaseFontSize);

       QShortcut *decreaseFontSizeShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Minus), this);//绑定了“Ctrl+-”为字体变大
       connect(decreaseFontSizeShortcut, &QShortcut::activated, this, &Widget::on_decreaseFontSize);

 3.3 字体变小

                3.3.1 代码展示

                3.3.2 源码
void Widget::on_decreaseFontSize()
{
    // 获取当前字体大小
    QFont font = ui->textEdit->font();
    int fontSize = font.pointSize();

    // 减少字体大小
    font.setPointSize(fontSize - 2);

    // 应用新字体
    ui->textEdit->setFont(font);
}

4、打开、关闭、保存设置快捷键

        4.1 源码

       QShortcut *on_openButton_clickedShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_O), this);//绑定了“Ctrl+O”为打开文件
       connect(on_openButton_clickedShortcut, &QShortcut::activated, this, &Widget::on_openButton_clicked);

       QShortcut *on_saveButton_clickedShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_S), this);//绑定了“Ctrl+S”为保存文件
       connect(on_saveButton_clickedShortcut, &QShortcut::activated, this, &Widget::on_saveButton_clicked);

       QShortcut *on_closeButton_clickedShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_C), this);//绑定了“Ctrl+C”为关闭文件
       connect(on_closeButton_clickedShortcut, &QShortcut::activated, this, &Widget::on_closeButton_clicked);

5、显示当前光标位置

        5.1 关联代码

connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(onCursorPositionChanged()));//cursorPositionChanged()这是一个属于textEdit控件的事件,
                                                                                                   //在UI界面转到槽中可以看到

        5.2 槽函数

void Widget::onCursorPositionChanged()
{

    QTextCursor cursor =  ui->textEdit->textCursor();
    //qDebug() << cursor.blockNumber()+1  <<","<< cursor.columnNumber() + 1;

    QString blockNum = QString::number(cursor.blockNumber()+1);
    QString columnNum = QString::number(cursor.columnNumber()+1);

    const QString labelMes = "L:"+blockNum+",C:"+columnNum+"   ";
    //const QString labelMes = "行:"+blockNum+",列:"+columnNum+"   ";
    ui->PositionLable->setText(labelMes);


    //设置当前行高亮
    QList<QTextEdit::ExtraSelection> extraSelections;
    QTextEdit::ExtraSelection ext;

    //1. 知道当前行
    ext.cursor = cursor;

    QBrush qBrush(Qt::lightGray);
    //2. 颜色
    ext.format.setBackground(qBrush);
    //配置段属性:整行显示,没有这句话不行
    ext.format.setProperty(QTextFormat::FullWidthSelection, true);
    //ext.format.setFontUnderline(true);
    //3. 设置
    //把ext加到ext的容器中
    extraSelections.append(ext);
    ui->textEdit->setExtraSelections(extraSelections);
}

6、字符编码格式的选择

        6.1 源码展示

 qDebug() << "currentIndexChanged:" << index;

        // 清空textEdit的内容
        ui->textEdit->clear();

        // 如果文件名没有设置,则退出
        if (fileName.isEmpty()) {
            qDebug() << "File name is not set.";
            return;
        }

        // 如果文件已经打开,先关闭文件
        if (file.isOpen()) {
            file.close();
        }

        // 获取当前选中的编码格式
        QString codecName = ui->comboBox->currentText();

        // 尝试打开文件
        file.setFileName(fileName);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            qDebug() << "file open error";
            return;
        }

        // 设置QTextStream使用的字符编码
        QTextStream in(&file);
        in.setCodec(codecName.toUtf8().constData());

        // 将文件指针移至文件开头
        file.seek(0);

        // 读取文件内容
        while (!in.atEnd()) {
            QString line = in.readLine();
            ui->textEdit->append(line);
        }

        // 关闭文件
        file.close();

7、widget.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QString>
#include <QFile>
#include <qcombobox.h>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();


    void on_increaseFontSize();
    void on_decreaseFontSize();

private slots:
    void on_openButton_clicked();



    void on_closeButton_clicked();

    void on_saveButton_clicked();

    void onCurrentIndexChanged(int index);

    void onCursorPositionChanged();

private:
    Ui::Widget *ui;
    QString fileName;  // 定义成员变量
    QFile file;

};
#endif // WIDGET_H

五、源码文件 

CSDN资源文件:打地基的小白的记事本icon-default.png?t=O83Ahttps://download.csdn.net/download/weixin_54210362/89728197?spm=1001.2014.3001.5503百度网盘链接:

链接: https://pan.baidu.com/s/18ZFUBRDnGb0I3QzQwyMAPw 提取码: ugw9 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值