最终效果:
图【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中界面的施加将更快速且便捷