QT实现简易记事本

news2025/1/11 14:49:24

QT的Qmainwindow实现简易记事本,不带有UI界面。

1、功能展示

 1、编辑文件时,文件名左上角有个“*”,代表文件未保存

2、菜单栏有文件、编辑的选项

3、工具栏有保存、新建、打开、调节字体、调节颜色。

4、文件菜单中有,新建,保存、打开、另存为

5、编辑栏中有复制、剪切、粘贴、撤销、恢复

2、mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMenuBar>
#include <QToolBar>
#include <QStatusBar>
#include <QTextEdit>
#include <QFileDialog>
#include <QFile>
#include <QDebug>
#include <QMessageBox>
#include <QAction>
#include <QToolButton>
#include <QFileInfo>
#include <QFontDialog>
#include <QColorDialog>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void openFile();//文件的打开,给槽函数调用的
    void readFile(QString filePath);
    //自已添加的公有槽函数
public slots:
    void openActionSlots();
    void newActionSlots();
    void saveActionSlots();
    void saveasActionSlots();
    void copyActionSlots();
    void pasteActionSlots();
    void cutActionSlots();
    void undoActionSlots();
    void redoActionSlots();
//自已添加的私有成员变量(数据成员)
private:
    QString fileName;//保存文件的文件名
    QString filePath;//保存文件的绝对路径,一般用
    QTextEdit *text;//主体区域的多行文本
};
#endif // MAINWINDOW_H

3、mainwindow.cpp

#include "mainwindow.h"

#include <QAction>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //1.给窗口设置图标、标题
    this->setWindowIcon(QIcon(":/icons/icons/1.png"));
    this->fileName = "新建文本文档.txt";
    this->setWindowTitle(this->fileName);

    //2.给窗口添加菜单栏,工具栏、状态栏、主体区域
    QMenuBar *menu_bar = new QMenuBar(this);
    this->setMenuBar(menu_bar);

    QToolBar *tool_bar = new QToolBar(this);
    this->addToolBar(tool_bar);

    QStatusBar *status_bar = new QStatusBar(this);
    this->setStatusBar(status_bar);

    this->text = new QTextEdit(this);//因为这是一个记事本,所以主体区域是多行文本框
    this->setCentralWidget(this->text);

    //3.给菜单栏添加菜单,有两个菜单:文件、编辑
    QMenu *file_menu = new QMenu("文件(F)",this);
    menu_bar->addMenu(file_menu);


    QMenu *edit_menu = new QMenu("编辑(E)",this);
    menu_bar->addMenu(edit_menu);

    //4.1 给文件菜单添加动作   file_menu的功能(动作) 新建、打开、保存、另存为
    QAction *new_action = new QAction(this);
    new_action->setText("新建(N)");
    new_action->setIcon(QIcon(":/icons/icons/new.png"));
    new_action->setShortcut(QKeySequence::New);
    file_menu->addAction(new_action);

    QAction *open_action = new QAction(QIcon(":/icons/icons/open.png"),"打开(O)",this);
    open_action->setShortcut(QKeySequence::Open);
    file_menu->addAction(open_action);

    QAction *save_action = new QAction(QIcon(":/icons/icons/save.png"),"保存(S)",this);
    save_action->setShortcut(QKeySequence::Save);
    file_menu->addAction(save_action);

    QAction *saveas_action = new QAction("另存为(A)",this);
    saveas_action->setShortcut(QKeySequence::SaveAs);
    file_menu->addAction(saveas_action);

    //4.2 给编辑菜单添加动作  edit_menu的功能(动作) 复制、粘贴、剪切、撤销、恢复
    QAction *copy_action = new QAction(QIcon(":/icons/icons/copy.png"),"复制(C)",this);
    copy_action->setShortcut(QKeySequence::Copy);
    edit_menu->addAction(copy_action);

    QAction *paste_action = new QAction(QIcon(":/icons/icons/paste.png"),"粘贴(V)",this);
    paste_action->setShortcut(QKeySequence::Paste);
    edit_menu->addAction(paste_action);

    QAction *cut_action = new QAction(QIcon(":/icons/icons/cut.png"),"剪切(X)",this);
    cut_action->setShortcut(QKeySequence::Cut);
    edit_menu->addAction(cut_action);


    QAction *undo_action = new QAction("撤销(Z)",this);
    undo_action->setShortcut(QKeySequence::Undo);
    edit_menu->addAction(undo_action);


    QAction *redo_action = new QAction("恢复(Y)",this);
    redo_action->setShortcut(QKeySequence::Redo);
    edit_menu->addAction(redo_action);

    //4.3.1 给工具栏添加动作,便于快速实现某些功能 :新建、打开、保存
    tool_bar->addAction(new_action);
    tool_bar->addAction(open_action);
    tool_bar->addAction(save_action);

    //4.3.2 给工具栏添加工具按钮,有字体和颜色的按钮
    QToolButton *font_btn = new QToolButton(this);//创建字体按钮对象
    font_btn->setIcon(QIcon(":/icons/icons/font.png"));//给字体按钮对象设置图标
    tool_bar->addWidget(font_btn);//向工具栏中添加这个按钮,使用addWidget

    QToolButton *color_btn = new QToolButton(this);
    color_btn->setIcon(QIcon(":/icons/icons/color.png"));
    tool_bar->addWidget(color_btn);



    //5.信号与槽函数的关联,三种方式:1、QT5。   2、QT4。 3、匿名槽函数(C++11)。
    //信号是菜单栏的行为动作,点击
    connect(new_action,&QAction::triggered,this,&MainWindow::newActionSlots);
    connect(open_action,&QAction::triggered,this,&MainWindow::openActionSlots);
    connect(save_action,&QAction::triggered,this,&MainWindow::saveActionSlots);
    connect(saveas_action,&QAction::triggered,this,&MainWindow::saveasActionSlots);
    //对文档输入内容时,文档名称会有个‘*’
    connect(this->text,&QTextEdit::textChanged,this,[=]()
    {
        this->setWindowTitle("*"+this->fileName);
    });
    //字体和颜色选择的信号和槽函数的关联,信号是工具按钮的点击,槽函数是匿名函数
    connect(font_btn,&QToolButton::clicked,this,[=]()
    {
        bool ok;
        QFont font =  QFontDialog::getFont(&ok,this);//获取字体
        this->text->setFont(font);//给文本设置字体
    });
    connect(color_btn,&QToolButton::clicked,this,[=]()
    {
        QColor color = QColorDialog::getColor(Qt::white,this);//获取颜色
        this->text->setTextColor(color);//给文本框的字体设置颜色
    });
    //对编辑菜单的信号和槽函数的关联  复制、粘贴、剪切、撤销、恢复
    connect(copy_action, &QAction::triggered, this, &MainWindow::copyActionSlots);
    connect(paste_action, &QAction::triggered, this, &MainWindow::pasteActionSlots);
    connect(cut_action, &QAction::triggered, this, &MainWindow::cutActionSlots);
    connect(undo_action, &QAction::triggered, this, &MainWindow::undoActionSlots);
    connect(redo_action, &QAction::triggered, this, &MainWindow::redoActionSlots);

    //connect(copy_action, &QAction::triggered, this->text, &QTextEdit::copy);

}

MainWindow::~MainWindow()
{
}

void MainWindow::openFile()
{
    //这是一个文件的绝对路径,不是单独的文件名
    this->filePath = QFileDialog::getOpenFileName(this,"打开","./","TXT(*.txt)");
    qDebug()<<this->filePath;
    //对文件进行操作,打开文件,读文件的全部内容,关闭文件
    QFile file(this->filePath);
    bool res = file.open(QFile::ReadOnly);
    if(res == true)
    {
        QByteArray data = file.readAll();//读文件中全部都内容,将其给多行文本区
        this->text->setText(data);
        file.close();//关闭文件
        //设置文件名为当前打开的文件名,将绝对路径的最后为文件名 back()或者last()获取分割后整个列表的最后一个值
        this->fileName = this->filePath.split("/").last();
        //设置给窗口标题
        this->setWindowTitle(this->fileName);
    }

}

void MainWindow::readFile(QString filePath)
{
    this->filePath = filePath;
    //对文件进行操作,打开文件,读文件的全部内容,关闭文件
    QFile file(this->filePath);
    bool res = file.open(QFile::ReadOnly);
    if(res == true)
    {
        QByteArray data = file.readAll();//读文件中全部都内容,将其给多行文本区
        this->text->setText(data);
        file.close();//关闭文件
        //获取到了文件名
        this->fileName = QFileInfo(this->filePath).fileName();
        //设置给窗口标题
        this->setWindowTitle(this->fileName);
    }

}

void MainWindow::newActionSlots()
{
    //QTextDocument *  是否怎么样,优先去找is开头并且函数类型是bool
    bool res = this->text->document()->isModified();
    //首先判断是否修改过文件
    if(res == true)//若修改了,则分情况讨论。是否要保存修改的文件,再新建文件
    {
        int ret = QMessageBox::question(this,"记事本","是否对修改进行保存",
                              QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);
        if(ret == QMessageBox::Yes)
        {
            qDebug()<<"保存";
            this->saveActionSlots();
            this->text->clear();
            this->fileName = "无标题-记事本";
            this->setWindowTitle(this->fileName);
        }
        else if(ret == QMessageBox::No)
        {
            qDebug()<<"不保存";
            this->text->clear();
            this->fileName = "无标题-记事本";
            this->setWindowTitle(this->fileName);
        }
    }
    else//若没有修改,则直接清空文本,设置窗口标题
    {
        this->text->clear();
        this->fileName = "无标题-记事本";
        this->setWindowTitle(this->fileName);
    }
}

void MainWindow::openActionSlots()
{
    bool res = this->text->document()->isModified();
    //打开新文件,要先判断当前文档是否修改过
    if(res == true)//文档是修改过,看是否要保存
    {
        int ret = QMessageBox::question(this,"记事本","是否对修改进行保存",
                              QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);
        if(ret == QMessageBox::Yes)//保存
        {
            qDebug()<<"保存";
            this->saveActionSlots();
            this->openFile();
        }
        else if(ret == QMessageBox::No)//不保存
        {
            qDebug()<<"不保存";
            this->openFile();
        }
    }
    else//文档没有修改过
    {
       this->openFile();
    }

}

void MainWindow::saveActionSlots()
{
    if(this->fileName == "无标题-记事本")
    {
        //新建一个无标题的文件,保存的话为另存为的操作,因为要给这个新文件一个位置
        this->saveasActionSlots();
    }
    else
    {
        QFile file(this->filePath);
        bool res = file.open(QFile::WriteOnly);//打开
        if(res)
        {
            //获取文本框的内容
            QString data = this->text->toPlainText();
            //写入文件中
            file.write(data.toUtf8());//把QString 转化为 QByteArray类型
            file.close();//文件关闭
            //获取文件名、设置给窗口标题
            this->fileName = QFileInfo(this->filePath).fileName();//根据文件的绝对路径,拿到文件名
            this->setWindowTitle(this->fileName);
            //把文本框的文档的修改状态改为未修改,只要保存了,就不能提示是否要保存
            this->text->document()->setModified(false);
        }
    }

}

void MainWindow::saveasActionSlots()
{
    this->filePath = QFileDialog::getSaveFileName(this,"另存为","./","TXT(*.txt)");
    //另存为,与保存类似
    QFile file(this->filePath);
    bool res = file.open(QFile::WriteOnly);//打开
    if(res)
    {
        //获取文本框的内容
        QString data = this->text->toPlainText();
        //写入文件中
        file.write(data.toUtf8());//把QString 转化为 QByteArray类型
        file.close();//文件关闭
        //获取文件名、设置给窗口标题
        this->fileName = QFileInfo(this->filePath).fileName();//根据文件的绝对路径,拿到文件名
        this->setWindowTitle(this->fileName);
        //把文本框的文档的修改状态改为未修改,只要保存了,就不能提示是否要保存
        this->text->document()->setModified(false);
    }
}

void MainWindow::copyActionSlots()
{
    this->text->copy();
}

void MainWindow::pasteActionSlots()
{
    this->text->paste();
}

void MainWindow::cutActionSlots()
{
    this->text->cut();
}

void MainWindow::undoActionSlots()
{
    this->text->undo();
}

void MainWindow::redoActionSlots()
{
    this->text->redo();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2097755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言从不挂科到高绩点】06-流程控制语句-循环语句

Hello&#xff01;彦祖们&#xff0c;俺又回来了&#xff01;&#xff01;&#xff01;&#xff0c;继续给大家分享 《C语言从不挂科到高绩点》课程 本套课程将会从0基础讲解C语言核心技术&#xff0c;适合人群&#xff1a; 大学中开设了C语言课程的同学想要专升本或者考研的…

2024测试开发必知必会:Pytest框架实战!

应用场景&#xff1a; pytest 框架可以解决我们多个测试脚本一起执行的问题。 它提供了测试用例的详细失败信息&#xff0c;使得开发者可以快速准确地改正问题。它兼容最新版本的 Python。它还兼容 unittest、doctest 和 nose&#xff0c;开箱即用。接下来我们详细了解下pyte…

LLM与知识图谱

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

昆仑山矿泉水《大湾区旅行者》正式开机,携手共赴一场净化心灵之旅

在这个快节奏的时代&#xff0c;我们总在寻找一片能让心灵得以栖息的地方。今年&#xff0c;昆仑山矿泉水与深圳卫视再度携手&#xff0c;推出充满人文温情与自然探索的慢生活旅行综艺《大湾区旅行者》&#xff0c;目前已于8月29日开机启航。本次旅行&#xff0c;昆仑山矿泉水与…

废品回收小程序,从传统到现代化的回收模式

在数字化发展的当下&#xff0c;废品回收行业也进行了更新换代&#xff0c;由传统“喊卖”&#xff0c;到目前的线上回收&#xff0c;将互联网小程序与废品回收相结合&#xff0c;打造一个线上回收模式&#xff0c;让大众可以直接通过手机进行回收。小程序的出现不仅解决了传统…

四层神经网络,反向传播计算过程;四层神经网络中:y的函数公式是什么

目录 四层神经网络,反向传播计算过程 网络结构 前向传播 损失函数 反向传播 1. 计算输出层到隐藏层 2 的梯度 2. 计算隐藏层 2 到隐藏层 1 的梯度 3. 计算输入层到隐藏层 1 的梯度 梯度下降更新 四层神经网络,反向传播计算过程 在四层神经网络中,使用均方差损失函数…

H264结构及RTP封装

H264是一种针对视频的压缩编码方式。 一、压缩方法 H264主要基于以下几种方法&#xff0c;将数据进行压缩&#xff1a; 1.帧内预测压缩&#xff1a;解决空间域数据冗余的问题 2.帧间预测压缩&#xff1a;&#xff08;运动估计与补偿&#xff09;解决时间域数据冗余的问题 3…

项目实训:创建一张贺卡以及一只盒子——WEB开发系列27

以下是两道关于基础 CSS 盒模型和其他盒子相关特性的练习题&#xff0c;适合测试对这些概念的掌握程度&#xff0c;通过实际的设计任务来深入理解这些概念。 练习题 1: 设计一张中秋节海报贺卡 任务描述 制作一张精美的中秋节海报贺卡&#xff0c;用于庆祝这个传统节日。你的…

visual studio 2022更新以后,之前的有些工程编译出错,升级到Visual studio Enterprise 2022 Preview解决

系列文章目录 文章目录 系列文章目录前言一、解决方法 前言 今天遇到一个问题&#xff1a;visual studio 2022升级成预览版以后&#xff0c;之前的有些工程编译出错。首先代码、项目设置都没有改变&#xff0c;只是更新了visual studio 2022。 在编译工程时&#xff0c;编译器…

Source-code-of-charging-云快充协议1.5+互联互通协议+新能源汽车充电桩系统

介绍 SpringBoot 框架&#xff0c;充电桩平台充电桩系统充电平台充电桩互联互通协议云快充协议1.5-1.6协议新能源汽车二轮车公交车二轮车充电-四轮车充电充电源代码充电平台源码Java源码 软件架构 软件功能 小程序端&#xff1a;城市切换、附近电站、电桩详情页、扫码充电、…

视频智能分析打手机检测算法安防监控打手机检测算法应用场景、算法源码、算法模型介绍

随着智能手机的普及&#xff0c;手机已成为人们生活中不可或缺的一部分。然而&#xff0c;在某些场合&#xff0c;如驾驶、会议、学校课堂等&#xff0c;不当使用手机可能会导致安全隐患或干扰他人。因此&#xff0c;开发出一种能够准确识别并阻止不当使用手机的行为检测算法显…

技术故障和情感危机,哪个更难修复?

在数字化时代&#xff0c;软件服务的稳定性至关重要。 然而&#xff0c;数字时代的感情同样脆弱! 超单身时代 这一概念主要用来描述一个国家或地区中单身人口占据较大比例的社会现象。以日本为例&#xff0c;根据日本国立社会保障与人口问题研究所的推算&#xff0c;到2035年…

[bevformer渲染可视化] 2d框可视化 并可视化出小目标

可视化代码&#xff1a; 代码使用方法&#xff1a; 1.复制代码全文到任意python文件中 2.下载nuscenes v1.0-mini数据集,修改数据集路径&#xff0c;保证能读取到数据集 3.按照需求修改代码&#xff08;本文是2dbox面积的面积和整个图片的面积比小于0.03视为小目标&#xff0…

电流互感器的操作、类型和极性注意事项

了解电流互感器及其在将大电流转换为小电流方面的重要作用&#xff0c;包括绕组比、类型以及保持计量极性的重要性。 电流互感器 (CT) 主要用于改变电压值。第二个结果是它们也会改变当前值。 升压变压器减少次级绕组中的电流&#xff0c;降压变压器增加次级绕组中的电流&…

vscode Git代码版本回退

在项目文件夹右键打开git bash&#xff0c;输入命令git log 查看提交的历史 commit&#xff0c;git log --prettyoneline将版本信息压缩到一行 使用git log可能会显示不全&#xff0c;按enter逐行查看&#xff0c;按end跳至末尾查看完成后&#xff0c;按q即可退出 找到自己想…

云计算实训40——部署nmt、部署project_exam_system项目

NMT N指的是nginx M指的是mysql T指的是tomcat 一、环境准备 #使用基础的docker指令来创建镜像&#xff0c;实现项目的发布 #安装docker、编辑daemon.json文件、安装docker-compose编排容器、启动docker #拖拽docker.sh的脚本[rootdocker--1 ~]# rz -Erz waiting to rec…

Qt QPushButton 按钮右上角增加小红点

简述 在项目里有时候应用类按钮在模块上新时&#xff0c;需要增加小红点提示。 效果图&#xff1a; 实现 实现的方法有很多 &#xff0c;下面介绍超简单的一种。 直接在按钮上贴一个 QLabel 即可。 #pragma once#include <QtWidgets/QWidget> #include "ui_paf…

宁武县乡村e镇招商引资暨产品推介会在京举办

2024年8月26日&#xff0c;宁武县乡村e镇招商引资暨产品推介会在北京市朝阳区五洲皇冠国际酒店举办。此次活动由山西省宁武县委、县政府主办&#xff0c;中国联合国采购促进会、中国商业文化研究会乡村振兴工作委员会协办&#xff0c;旨在宣传推介宁武县丰富的自然资源和农特产…

“1X”家用人形机器人:NEO Beta人形机器人,专为家庭使用而设计

1X机器人是指挪威人形机器人初创企业1X公司推出的一款名为NEO Beta的双足人形机器人原型。这款机器人专为家庭使用而设计&#xff0c;身高约1米65&#xff0c;体重30公斤&#xff0c;具有仿生设计&#xff0c;能够在人与人之间安全工作。NEO Beta采用了OpenAI的技术支持&#x…

spotbugs问题描述汉化

1 支持多语言 spotbugs自身支持问题描述的国际化&#xff0c;默认支持了英语、日语和法语。 问题描述都配置在messages.xml文件中。 (在源码中的位置&#xff1a;/spotbugs//spotbugs/etc/messages.xml) 2 多语言文件名 如果需要支持中文可以将messages.xml中的英文翻译过来。将…