1、在创建记事本之前先明白有哪些功能:
先创建一个菜单栏,菜单栏是用来装各种功能的一个地方如上图所示,文件、编辑所在的地方为菜单栏,
QMenuBar *menubar=menuBar();
菜单栏创建好后再创建菜单,菜单在菜单栏里面,
那么很明显,“文件”,“编辑”等就是菜单。
创建命令如下:
QMenu *file=new QMenu("文件",this);
menubar->addMenu(file);
QMenu*editor=new QMenu("编辑",this);
menubar->addMenu(editor);
使用addMenu把菜单放进菜单栏里面,这里可以先去帮助文档里面查找QMenu 有哪些属性和方法。
菜单创建好之后再创建菜单项,菜单项就是菜单里的各个功能,
创建方法如下:
QAction *open=new QAction("打开",this);
QAction *save=new QAction ("保存",this);
file->addAction(open);
file->addAction(save);
这里如果不知道怎么做,或者不知道用啥命令创建菜单项,可以在另外一个新建的创口中在.ui文件中先手动添加,然后看他是用的啥命令,
之后可以创建工具栏,工具栏的作用是可以显示菜单里面的菜单项,创建方法也可以通过上图的方式先查找,然后再手动添加,加深记忆哈哈。
QToolBar *toolbar=ui->mainToolBar;
toolbar->addAction(open);
toolbar->addAction(save);
如果不知道是否可以添加,可以打开索引查找:
查找后发现添加命令是addAction.
这就把菜单项里面的内容添加到工具栏里面了,可以按照需要添加。
然后就是文本编辑器,先添加头文件#include<QTextEdit>
,注意,有单行的和多行,这里选择添加多行的。
这里是在.ui文件中收动添加的。所以这里用ui的指针获取文本框。
text=ui->textEdit;
setCentralWidget(text);
获取之后在索引里面查找QMAinWindow查找属性,把文本框设置为核心部件,不然的话当你拖动窗口是,文本编辑框的大小不会随着改变。
这里的“打开”、“保存”、“编辑”等就是信号,我们点击他们就是触发了这个信号。
2、槽函数
以上准备工作就完成了,剩下的就是当我们点击打开这个菜单项时,可以触发指令,也就是说点击“打开”可以打开我们想要的文件夹。
槽函数现在头文件中的公共区域声明
这里我们需要手动添加public slots:这个公共的槽变量。然后在里面先添加我们第一个槽函数,
void openfile();
这个槽函数声明已经完成了,那么我们需要在.cpp文件中定义这个槽函数,
首先我们要明白这个槽函数需要完成那些动作,因为信号发出后给槽函数,槽函数需要完成一些列你想要的动作。
我们的记事本想要的就是打开文件,把文件里面的内容读到文本编辑器中。
这里就需要添加一个头文件,这个头文件是一个文件对话框,也就是说通过他,我们可以打开一个对话框,那么什么是对话框呢?
这就是一个对话框,我是这样理解的:我们与机器之间的交流的,百度百科说:在用户界面,想用户显示信息的。
首先需要添加文件对话框的头文件#include<QFileDialog>
我们还是可以在索引里面查找对话框的各个属性和方法。
void MainWindow::openfile()
{
QString filepath=`QFileDialog::getOpenFileName`(this,"记事本打开文件","D:/","*.txt");
if(filepath.isEmpty())
{
qDebug()<<"空文件夹"<<endl;
}
else
{
QFile file(filepath);
if(file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QByteArray array=file.readAll();
QString str(array);
qDebug()<<str<<endl;
text->setText(str);
file.close();
}
}
}
上面代码的第一行QFileDialog::getOpenFileName
是打开文件对话框,获取文件的名字(路径),里面的第三个参数是默认打开哪一个文件对话框,我这里设置的是D盘,最后一个是筛选打开的类型,这里设置的是只保留.txt文件,其余的不打开。
我们按照索引的介绍使用这个文件对话框,先查属性,如下图
可以看到返回的是一个QString类型,所以,我们需要用QString类型接收,如果你想知道返回的到底是啥,你可以用下边这行查看返回值。你回发现真是一个txt文件的路径+txt的名字。
qDebug()<<filepath<<endl;
文件对话框已经获取了文件的完整路径了,但是还没有文件呢,那么接下来该干啥呢?
接下来就该创建文件了,这里要先添加头文件#include<QFile>
使用QFile file(filepath)创建一个文件,这里要把文件的路径名放里面,按照文档上的说明也就是:用给定的父对象构造一个新的文件对象。
同样的,查找QFile 文档属性和方法。得知文件有个open属性,返回的是bool类型的值,open中设定打开文档的方式,这里设定只读(从文档里面读)和换行(读完一行换下一行)。
file.open(QIODevice::ReadOnly | QIODevice::Text)
接下来就是设定读取多少,这里继续查,先查QFile 看有没有读得方法,如果没有就去QFile 的父类中去找
查找一圈后发现没有,那就继续在QFileDevice的父类中找。
最后发现有,并且返回值是QByteArray类型的(也就是数组)既然返回值是一个数组,那么我们就需要用QByteArray创建一个数组去接收。
向text文档中写数组肯定是不行的,要将数组转为字符串类型使用QString,
最后向text中写入内容,想文档编辑器中写入使用的命令为:setText();
记得打开文档之后要用close关闭。
到这里,文件文档的读取的槽函数已经完成了,但是千万不要忘记,要是用connec将信号和槽函数关联起来,这样才是正确的,如下:
connect(open,&QAction::triggered,this,&MainWindow::openfile);
信号发送者是:open,信号的动作是triggered,触发的意思。接受者:MainWindow下的openfile函数,也就是槽函数。
到此这打开的功能算是完成了,但是有一点是要记住,text这个变量要放在头文件的public里面,设置成全局变量,因为下面的两个槽函数要用,如果设置成局部变量的话,两个函数没有访问权限。
按照上边的流程,保存的槽函数也是同样的道理;
但是要替换几个函数,替换成getSaveFileName,看名字可以理解的,QIODevice::WriteOnly这里是只写,因为我们要读编辑器里面的内容写到文档里面。
这里要是用文本编辑流,QTextStream,也可以查索引知道如何使用。使用QTextStream 构造一个文本流对象in,把stdin传入,也就是stdin变成文本流,然后想文本流中输入内容,使用>>(输入符号)。
从text文档编辑器中读取内容,以字符串的形式返回。
使用setCodec(“UTF-8”)设置中文编码,不然输入中文会乱码。
最后在向文档中输入 text->setText(“”)即可清空所有内容。别忘了关闭文件夹。
QString textfile=text->toPlainText();
void MainWindow::savefile()
{
QString path=QFileDialog::getSaveFileName(this,"保存文件","D:/","*.txt");
if(path.isEmpty())
{
qDebug()<<"空文件夹"<<endl;
}
else
{
QFile file(path);
if(file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QString textfile=text->toPlainText();
QTextStream out(&file);
out.setCodec("UTF-8");
out<<textfile<<endl;
text->setText("");
file.close();
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)