QT项目实战:Windows下的记事本功能

最终效果:

图【1-1】

 菜单栏中的共包含四个动作。打开文件会跳转至当前目录下的windows跳窗,显示所有的txt文档,如图【1-3】

 图【1-2】

 图【1-3】

若打开之前文档内容已被修改,则会弹框提示是否保存,如图【1-4】

 图【1-4】

             其他功能与windows下的记事本功能一样,不过多做介绍。再来看工具栏的功能

  图【1-5】

   图【1-6】

-------------------------------------------我是分割线----------------------------------------------------------------------

接下来讲解实现功能的格各列表代码:

​​​一、初始化构造菜单栏、工具栏、状态栏并由main.cpp的对象W调用从而构造初始界面。

如下:

    setWindowIcon(QIcon(":/pohto/yuwenhao.jpg"));设定此APP图标
    ui->setupUi(this); ui界面作为系统的成员函数,被系统自动建立调用

    chuangkou=new QMenuBar(this);  创建窗口菜单栏对象
    this->setMenuBar (this->chuangkou); 将窗口菜单栏对象放在当前的窗口上显示

    gongju=new QToolBar(this); 实例化工具栏
    this->addToolBar(this->gongju);

    zhuangtai=new QStatusBar(this) ;放状态栏到界面上
    this->setStatusBar(this->zhuangtai);

    caidan=new QMenu(this);创建的菜单对象1(文件)
    caidan->setTitle("文件");
    this->chuangkou->addMenu(caidan);

    caidan1=new QMenu(this);创建的菜单对象2(编辑)
    caidan1->setTitle("编辑");
    this->chuangkou->addMenu(caidan1);

    caidan2=new QMenu(this);创建的菜单对象3(上面的图没有调用查看这个菜单对象)
    caidan2->setTitle("查看");
    this->chuangkou->addMenu(caidan2);

二、初始化构造动作行为赋值给菜单栏中的文件和编辑

    Newfile  = new QAction(this); //创建一个动作①
    Newfile->setText("新建文件"); //给当前动作进行命名
    Newfile->setIcon(QIcon(":/pohto/new.png")) ;//给当前动作给一个执行图标
    Newfile->setShortcut(QKeySequence::New); //给当前执行动作给一个系统定制的快捷键
    caidan->addAction(Newfile); //将整理好的动作放进去上面的菜单栏里面

    open =new QAction(this);
    open ->setText("打开文件");
    open->setIcon(QIcon(":/pohto/open.png"));
    open->setShortcut(QKeySequence::Open);
    caidan->addAction(open);

    Save =new QAction(this);
    Save ->setText("保存文件");
    Save->setIcon(QIcon(":/pohto/textbold.png"));
    Save->setShortcut(QKeySequence::Save);
    caidan->addAction(Save);

    Saveother =new QAction(this);
    Saveother ->setText("另存为");
    Saveother->setIcon(QIcon(":/pohto/textunder.png"));
    Saveother->setShortcut(QKeySequence::SaveAs);
    caidan->addAction(Saveother);

    Copy=new QAction(this);  //创建一个copy行为,放到编辑菜单栏里面
    Copy ->setText("复制文本");
    Copy->setIcon(QIcon(":/pohto/copy.png"));
    Copy->setShortcut(QKeySequence::Copy);
    caidan1->addAction(Copy);

    Paste=new QAction(this);  //创建一个Paste行为,放到编辑菜单栏里面
    Paste ->setText("粘贴文本");
    Paste->setIcon(QIcon(":/pohto/paste.png"));
    Paste->setShortcut(QKeySequence::Paste);
    caidan1->addAction(Paste);

三、初始化构造文本编辑框,消息标签提示行为

EWrite = new QTextEdit(this); 给当前界面实例化一个可写地方②
this->setCentralWidget(EWrite);  在该window平台自带的限定区域进行适配编辑框

Newfile->setStatusTip("点我创建文件"); 给执行动作添加一个标签提示(左下角)③
open->setStatusTip("选中一个文件并打开显示在文本框");
Save->setStatusTip("保存目前修改的内容");
Saveother->setStatusTip("将写好的内容放置新文件");
Copy->setStatusTip("复制当前选中的文本");
Paste->setStatusTip("粘贴当前选中的文本");

this->FileName=("无标题-文本框"); 初始化一个文件名④
this->setWindowTitle(this->FileName);将文件名放在程序窗口主题

四、初始化工具对象,同时将工具对象放至工具栏。同时给行为动作添加图标至工具栏

同时初始化状态标签

 this->gongju->addAction(this->open);  在已经创建好的工具栏上加入Action的图标快捷方式⑤
    this->gongju->addAction(this->Save);
     this->gongju->addAction(this->Copy);

    pen =new QToolButton(this); 创建一个工具对象(字体)⑥
    this->pen->setIcon(QIcon(":/pohto/font.png")); 给对象上图标
    this->gongju->addWidget(pen); 添加到工具栏的,以方便其调用内容

    color=new QToolButton(this);
    this->color->setIcon(QIcon(":/pohto/color.png"));
    this->gongju->addWidget(color);

    notice = new QLabel("欢迎使用文浩笔记本",this);创建标签⑦
    statusBar()->addPermanentWidget(notice);把标签永久性打印在状态栏上(右下角)

 五,开始构建菜单行为中的文件功能 ,类似这种

 博主这边将提供一个打开文件与另存为的源文件,只要看懂了,其他的都能写出来

先来看打开文件源代码:

void  MainWindow::openFileSlot()Action打开-槽函数功能,搜索当前路径,显示路径下的所有txt文档,选中并打开至文本框
{
    bool res = this->EWrite->document()->isModified(); 系统给定的内容,判定文本框内是否有文字变动
    if(res ==true)
    {
        int ret =  QMessageBox::question(this,"温馨提示","是否需要保存修改的内容?",QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);
        if(ret ==QMessageBox::Yes)
        {
          this->SaveFile(); 保存功能  封装的  下面有详细
          this->Open1(); 正常打开不判断 封装的 下面有
        }
        else if(ret ==QMessageBox::No)
        {
            this->Open1();
        }
        else if(ret ==QMessageBox::Cancel)
        {
            return;
        }
    }
    else
    {
        this->Open1();  文本未修改则直接打开
    }
}


void MainWindow::Open1()  //公有制函数 功能不判断文本框直接打开某一个文件
{
    this->FilePath = QFileDialog::getOpenFileName(this,"选择需要打开的文件",".","TXT(*.txt)");  //父对象|窗口名|搜索路径|搜索对象
    if(FilePath.isNull()) //此时的FilePath/是文件路径  具体为我们打开的文件路径
    {
        qDebug()<<QString("123");
        return;
    }
    QFileInfo fileInfo(FilePath);   //解析目前的文件的名字,但无法操作打开和写入
    QString  FileName = fileInfo.fileName();  //获取打开的文件名字,用来做窗口主题更换

    QFile  file(FilePath); //直接获取路径下的文件,操作其进行读入
    bool ret = file.open(QIODevice::ReadOnly) ;//以只读方式打开指定路径下的文件
    if(ret == false)
    {
        qDebug()<<QString("文件打开失败!");
        return;
    }
    this->EWrite->setText(file.readAll()); //将读取的文件所有内容发送至编辑框中
    this->FileName = FileName;  //赋值当前文件名至public区域的FIlename中,目的是为了更新主题名
    this->setWindowTitle(this->FileName); //把public区域的FIlename文件名改为自己的窗口主题
    file.close();
}

再来看另存为动作源代码:

void MainWindow::SaveAsFile()//Action另存为-槽函数功能,将文本框内容另存至新文件
{
    QString name =QFileDialog::getSaveFileName(this, "另存为", ".", "TXT(*.txt)"); //显示当前路径下的txt文件,返回点击的文件路径
    if(name.isNull())
    {
        qDebug()<<QString("显示框调取失败1");
        return;
    }
    QFileInfo fileInfo(name); //解析绝对路径下的文件名
    this->FileName=fileInfo.fileName();  //用规定的操作将解析的文件名赋值到类的文件名中
    QFile file(name);//给文件权限,目的是操作绝对路径下的文件
    bool res=file.open(QIODevice::WriteOnly);
    if(res==false)
    {
        return;
    }
    //获取文本框内容
    QString Temp= this->EWrite->toPlainText();
    // QByteArray arry;
    // arry.clear();
    //arry.append(str);
    // file.write(arry);
    file.write(Temp.toStdString().c_str());//将字符串转为计算机可识别的形式写入此文件内
    this->FilePath=name;
    this->setWindowTitle(this->FileName);
    file.close();
}

 六,将行为进行信号与槽的链接(构造函数里写)

/⑧各种信号的链接
    connect(Copy,SIGNAL(triggered()),this->EWrite,SLOT(copy()));复制发送信号,随后进入编辑框自带的槽函数中实现复制
    connect(Paste,SIGNAL(triggered()),this->EWrite,SLOT(paste()));粘贴行为发送信号,随后进入编辑框自带的槽函数中实现粘贴
    connect(color,SIGNAL(clicked()),this,SLOT(ChangeColor()));选中字体点击颜色后,发送信号至改变颜色槽函数
    connect(pen,SIGNAL(clicked()),this,SLOT(ChangePen()));选中字体点击字体后,发送信号至改变字体格式槽函数
    connect(Newfile,SIGNAL(triggered()),this,SLOT(CreateFile()));当点击新建文件时,执行信号要求的函数。
    connect(open,SIGNAL(triggered()),this,SLOT(openFileSlot()));链接执行打开的操作,当发送打开文件操作时进行操作
    connect(Save,SIGNAL(triggered()),this,SLOT(SaveFile()));点击保存时,信号发送给执行保存的槽函数
    connect(Saveother,SIGNAL(triggered()),this,SLOT(SaveAsFile()));点击另存为时,信号发送给执行另存为的槽函数
    connect(this->EWrite,SIGNAL(textChanged()),this,SLOT(updateWindowTitle())); 文本框有变动时,发送信号给执行主题变更的槽函数

七,查看一下构建的头文件、数据成员、成员函数、构建槽函数

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMenuBar>//菜单栏建立
#include <QMainWindow>
#include <QAction>//动作栏
#include <QToolBar>  //工具栏
#include <QStatusBar> //状态栏
#include <QMenu>//菜单内容
#include <QIcon>//图标内容
#include <QTextEdit>//编辑框(核心区域)
#include <QMessageBox>//弹出来的绘画课
#include <QFileInfo>//解析绝对路径文件名
#include <QFile>//操作文件
#include   <QDebug>//打印异常地方
#include <qfiledialog.h>//找文件路径
#include <QFontDialog> //更改文本框中选择的内容格式
#include <QToolButton>//工具内容
#include <QColorDialog>//更改文本框选择的内容颜色
#include <QLabel>//设定标签,将其放入状态栏

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:

    void  ClearT();
    void  Open1();

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QTextEdit*EWrite; //实例化的能写的内容地方
    QMenuBar*  chuangkou;//实例化的窗口对象
    QToolBar*  gongju;//实例化的工具对象
    QStatusBar* zhuangtai;//实例化的状态对象
    QMenu* caidan;  //窗口上面的内容1显示
    QMenu*caidan1; //窗口上面的内容2显示
    QMenu*caidan2; //窗口上面的内容2显示
    QAction * open;//打开操作(caidan内容1)
    QAction * Save;//保存操作(caidan内容1)
    QAction* Saveother;//另存为操作(caidan内容1)
    QAction *Copy; //工具栏的赋值粘贴功能
    QAction *   Paste;//创建操作(caidan内容1)
    QAction *   Newfile;//创建操作(caidan内容1)
    QString  FileName; //定义获取的文件名
    QString FilePath;//文件路径
    QToolButton *pen;//工具栏的字体功能
    QToolButton *color;//工具栏的颜色功能
    QLabel *notice; //状态栏的消息提醒功能

public slots:
    void CreateFile();
    void  openFileSlot();//打开显示路径文件
    void SaveFile();//保存文件
    void  SaveAsFile(); //另存为
    void  updateWindowTitle();//更改窗口名字
    void  ChangePen();//改变文本框字体格式
    void  ChangeColor();//改变文本框字体颜色

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

--------------------------------------------我是分割线----------------------------------------------------------------

言而总之,记事本的功能实现很简单,看懂上面这些后无论去添加什么功能都能得心应手。对信号与槽的理解、对QT中界面的施加将更快速且便捷

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值