前言
本篇记录Qt的MainWindow类的编写,主要是对菜单栏的操作。最终要实现如图的编辑器
具体步骤
(1)创建项目
项目建好了,与Widget看起来只有名字的区别
但是在ui里多出了菜单栏
最上边有一行:在这里输入
(2)设计UI
这次不能选LineEdit了,它只能写一行,而TextEdit可以写很多很多行
选中整个,再选择垂直布局,这样TextEdit就可以占满全屏,并且后续增大减小背景时它也会跟着变大变小
接下来设计菜单栏,这里有几个要注意的点
如果要添加快捷键功能,需要在括号里加入&符号再加字母,然后界面里这个字母会有一条下划线
在每个块的子功能块不能输入中文,所以我们在旁边的块写好中文复制到子功能块,这个已经是主要功能了,所以菜单栏上其他功能写写就行了
预览的快捷键是Alt+shift+R,这样可以看看效果如何,看起来效果很正常,我们继续
来讲一下它们的层次结构
这一行叫做menubar,即菜单栏
这一个一个的叫做menu,叫菜单
这里边的子版块叫做action,即动作
好了,接下来我们修改控件的命名,方便后续代码操作
(3)实现功能
新建:
在action板块是没法右键转到槽的,所以需要自己connect连接信号。
connect(ui->newAction,&QAction::triggered,this,&MainWindow::newActionSlot);
在构造函数里写这样一句
自创槽函数内容:
void MainWindow::newActionSlot()
{ui->textEdit->clear();this->setWindowTitle("新建文本文档.txt");
}
这个新建实现的就是清空文本内容然后把窗口名字叫做“新建文本文档.txt”
演示一下:
可以看到窗口名字改了
打开:
connect(ui->openAction,&QAction::triggered,this,&MainWindow::openActionSlot);
先写connect函数。意思是ui里的打开键被点击之后就调用主窗口类里的openActionSlot函数
void MainWindow::openActionSlot()
{QString fileName = QFileDialog::getOpenFileName(this,"选择一个文件",QCoreApplication::applicationFilePath(),"*.cpp");if(fileName.isEmpty()){QMessageBox::warning(this,"警告","请选择一个文件");}else{//qDebug() <<fileName;QFile file(fileName);file.open(QIODevice::ReadOnly);QByteArray ba = file.readAll();ui->textEdit->setText(QString(ba));file.close();}
}
这个函数里要包含两个头文件内的东西
#include<QMessageBox>
#include<QDebug>
详细讲解一下这段代码:
QFileDialog::getOpenFileName(this,"选择一个文件",QCoreApplication::applicationFilePath(),"*.cpp");
这句代码是固定的,把它记住就行了。作用是打开一个选取文件的对话框。参数的意思是调用对象,对话框标题,文件路径,指定的文件类型。这个函数的返回值是文件名,所以要在前边定义一个存储文件名的变量
if(fileName.isEmpty()){QMessageBox::warning(this,"警告","请选择一个文件");}
如果在选择文件的对话框里选择了取消,那返回值自然就是空的。如果返回值是空的,就调用QMessageBox里的成员函数弹出一个警告对话框。这个类需要包含头文件<QMessageBox>
else{//qDebug() <<fileName;QFile file(fileName);file.open(QIODevice::ReadOnly);QByteArray ba = file.readAll();ui->textEdit->setText(QString(ba));file.close();}
注释语句是先前测试用的,可以输出文件的路径和文件名,这个函数也需要包含头文件<QDebug>。再定义QFile类的对象file,构造函数传参传的是文件名。然后调用成员函数open,以只读方式打开,然后再用QByteArray类的对象存储打开后的文件。再在界面里的文本框输出所有内容。关闭文件
效果展示:
另存为功能
void MainWindow::saveActionSlot()
{QString fileName = QFileDialog::getSaveFileName(this,"选择一个文件",QCoreApplication::applicationFilePath());if(fileName.isEmpty()){QMessageBox::warning(this,"警告","请选择一个文件");}else{QFile file(fileName);file.open(QIODevice::WriteOnly);QByteArray ba;QString text = ui->textEdit->toPlainText();ba.append(text.toUtf8());file.write(ba);file.close();}
}
connect函数和槽函数的定义依旧还要写,但是这里只分析这段槽函数具体实现即可:
QString fileName = QFileDialog::getSaveFileName(this,"选择一个文件",QCoreApplication::applicationFilePath());
还是用固定句式操作一手,但是这次没有标注文件类型,所以对话框里弹出的路径就是当前文件夹路径。
警告判断没什么好说的了,讲一下选中一个文件之后的操作
还是定义一个文件类,把路径传进构造函数里,然后调用对象的open函数,以只写方式打开,再用QByteArray类型存储界面里的东西。这里要注意下:新版本Qt已经不能用QByteArray直接存储QString类型了,所以需要多一步把它转换成UTF-8.然后把要写的内容传进新的文件里,关闭文件即可
经测试,是可以正常使用的
篇末总结
(1)知识收获
1.对connect和槽函数有了更深的理解
2.初步知道了如果操作一个文件
3.知道了直接转到槽有多方便,也知道了不能直接转到槽的话应该怎么办
4.了解了MainWindow界面的设计和功能的实现
5.知道如何能弹出一个选择文件的对话框
(2)作者的话
作者由于没学完Qt就开始做课设了,非常惨烈,前前后后栽了好多跟头,现在几乎也废了,非常伤心,感觉整个人都不好了。刚开始想的是边学边做,碰壁之后才发现如果不知道那个东西的存在是不会往那个方向考虑的。所以边学边做还是不太适合我。我觉得应该要有一个宏观的思考之后再去做项目,才能做好