1、效果
2、mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QMdiSubWindow>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//改变字体
QFont font;
font.setBold(true);//(加粗)
font.setStyle(QFont::StyleOblique);//斜体
ui->action_New->setFont(font);
Init();
}
MainWindow::~MainWindow()
{
delete ui;
}
/*function*/
void MainWindow::Init(){
codeName = "UTF-8";
//信号与槽
//文件
connect(ui->action_New,SIGNAL(triggered(bool)),//triggered相当于单击新建事件
this,SLOT(doProcessTriggeredByNew(bool)));
connect(ui->action_Open,SIGNAL(triggered(bool)),
this,SLOT(doProcessTriggeredByOpen(bool)));//打开文件事件
connect(ui->actionUTF8,SIGNAL(triggered(bool)),
this,SLOT(doProcessTriggeredByUTF_8(bool)));//绑定切换编码事件
connect(ui->actionUTF8,SIGNAL(triggered(bool)),
this,SLOT(doProcessTriggeredByGB2312(bool)));//绑定切换编码事件
connect(ui->action_Save,SIGNAL(triggered(bool)),
this,SLOT(doProcessTriggeredBySave(bool)));//保存
connect(ui->action_SaveAs,SIGNAL(triggered(bool)),
this,SLOT(doProcessTriggeredBySaveAs(bool)));//另存为
connect(ui->action_Exit,SIGNAL(triggered(bool)),//退出
this,SLOT(doProcessTriggeredByExit(bool)));
//窗口
connect(ui->action_Close,SIGNAL(triggered(bool)),//关闭
this,SLOT(doProcessTriggeredByClose(bool)));
connect(ui->action_CloseAll,SIGNAL(triggered(bool)),//关闭所有
this,SLOT(doProcessTriggeredByCloseAll(bool)));
connect(ui->action_Tile,SIGNAL(triggered(bool)),//平铺
this,SLOT(doProcessTriggeredByTile(bool)));
connect(ui->action_Cascade,SIGNAL(triggered(bool)),//层叠
this,SLOT(doProcessTriggeredByCascade(bool)));
connect(ui->action_Next,SIGNAL(triggered(bool)),//下一个
this,SLOT(doProcessTriggeredByNext(bool)));
connect(ui->action_Prevous,SIGNAL(triggered(bool)),//上一个
this,SLOT(doProcessTriggeredByPrevous(bool)));
//帮助
connect(ui->action_About,SIGNAL(triggered(bool)),//关于
this,SLOT(doProcessTriggeredByAbout(bool)));
connect(ui->action_AboutQT,SIGNAL(triggered(bool)),//关于QT
this,SLOT(doProcessTriggeredByAboutQT(bool)));
}
/*function end*/
/*event*/
/*event end*/
/*slots*/
//新建action
void MainWindow::doProcessTriggeredByNew(bool){
qDebug()<<"triggered New action"<<endl;
subText *sub = new subText(); //创建子类
ui->mdiArea->addSubWindow((QWidget *)sub); //在mdiArea里显示
sub->setCodeName(codeName);//设置编码格式
sub->NewFile();
sub->show(); //显示子类(子界面,继承文本输入框)
}
//打开action
void MainWindow::doProcessTriggeredByOpen(bool){
qDebug()<<"triggered open action"<<endl;
subText *sub = new subText(); //创建子类
ui->mdiArea->addSubWindow((QWidget *)sub); //在mdiArea里显示
sub->setCodeName(codeName);//设置编码格式
sub->OpenFile();
sub->show(); //显示子类(子界面,继承文本输入框)
}
//编码切换
void MainWindow::doProcessTriggeredByUTF_8(bool){
qDebug()<<"triggered UTF-8 action"<<endl;
this->codeName = "UTF-8";
}
void MainWindow::doProcessTriggeredByGB2312(bool){
qDebug()<<"triggered GB18030 action"<<endl;
this->codeName = "GB18030";
}
//保存
void MainWindow::doProcessTriggeredBySave(bool){
qDebug()<<"triggered Save action"<<endl;
QMdiSubWindow *subWin =ui->mdiArea->activeSubWindow();//保存当前激活的子窗体
if(subWin == NULL)return;
QWidget *wid=subWin->widget();
if(subWin == NULL)return;
subText *sub = (subText*)wid;
if(sub ==NULL )return;
sub->SaveFile();
}
//另存为
void MainWindow::doProcessTriggeredBySaveAs(bool){
qDebug()<<"triggered SaveAs action"<<endl;
QMdiSubWindow *subWin =ui->mdiArea->activeSubWindow();//保存当前激活的子窗体
if(subWin == NULL)return;
QWidget *wid=subWin->widget();
if(subWin == NULL)return;
subText *sub = (subText*)wid;
if(sub ==NULL )return;
sub->SaveAsFile();
}
//退出
void MainWindow::doProcessTriggeredByExit(bool){
qDebug()<<"triggered exit action"<<endl;
this->close();
}
//关闭窗体
void MainWindow::doProcessTriggeredByClose(bool){
qDebug()<<"triggered close action"<<endl;
ui->mdiArea->closeActiveSubWindow();
}
//关闭所有窗体
void MainWindow::doProcessTriggeredByCloseAll(bool){
qDebug()<<"triggered closeall action"<<endl;
ui->mdiArea->closeAllSubWindows();
}
//平铺
void MainWindow::doProcessTriggeredByTile(bool){
qDebug()<<"triggered tile action"<<endl;
ui->mdiArea->tileSubWindows();
}
//层叠
void MainWindow::doProcessTriggeredByCascade(bool){
qDebug()<<"triggered cascade action"<<endl;
ui->mdiArea->cascadeSubWindows();
}
//下一个
void MainWindow::doProcessTriggeredByNext(bool){
qDebug()<<"triggered next action"<<endl;
ui->mdiArea->activateNextSubWindow();
}
//上一个
void MainWindow::doProcessTriggeredByPrevous(bool){
qDebug()<<"triggered prevous action"<<endl;
ui->mdiArea->activatePreviousSubWindow();
}
//关于
void MainWindow::doProcessTriggeredByAbout(bool){
qDebug()<<"triggered about action"<<endl;
QMessageBox::about(this,"关于作者","ower by xx xx xx");
}
//关于QT
void MainWindow::doProcessTriggeredByAboutQT(bool){
qDebug()<<"triggered AboutQT action"<<endl;
QMessageBox::about(this,"关于QT","qt by xx xx xx");
}
/*slots end*/
3、mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <subtext.h> //子界面,继承文本输入框
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void doProcessTriggeredByNew(bool);
void doProcessTriggeredByOpen(bool);
void doProcessTriggeredByUTF_8(bool);
void doProcessTriggeredByGB2312(bool);
void doProcessTriggeredBySave(bool);
void doProcessTriggeredBySaveAs(bool);
void doProcessTriggeredByExit(bool);
void doProcessTriggeredByClose(bool);
void doProcessTriggeredByCloseAll(bool);
void doProcessTriggeredByTile(bool);
void doProcessTriggeredByCascade(bool);
void doProcessTriggeredByNext(bool);
void doProcessTriggeredByPrevous(bool);
void doProcessTriggeredByAbout(bool);
void doProcessTriggeredByAboutQT(bool);
private:
Ui::MainWindow *ui;
QString codeName;
void Init();
};
#endif // MAINWINDOW_H
4、subtext.cpp
#include "subtext.h"
//构造函数
subText::subText(QWidget *parent) : QTextEdit(parent)
{
isEdit = false;
myfile = new QFile(this);
}
/*function*/
void subText::NewFile(){
static int index=1;
QString title =QString("未命名文档[%1][*]").arg(index);
this->setWindowTitle(title);//设置窗体名字
index++;
//出于编辑后使用星号
connect(this->document(),SIGNAL(contentsChanged()),this,SLOT(doProcesscontentsChanged()));//内容改变后‘*’显示
}
void subText::OpenFile(){
QString filename = QFileDialog::getOpenFileName(this,"获取文本文件",".","Text(*.cpp *.txt *.h)");//打开文件对话框
if(filename.isEmpty()){
return;
}
//把文件路劲保持,文件设置到窗体
this->filename = filename;
//第一种获取文件名
// QStringList list =filename.split("/");//字符串分割,以/分割
// QString title = list.at(list.length()-1);//最后一个为文件名
//第二种获取文件名
QFileInfo info(filename);
QString title = QString("%1[*]").arg(info.fileName());
this->setWindowTitle(title);
//处于编辑后使用星号
connect(this->document(),SIGNAL(contentsChanged()),this,SLOT(doProcesscontentsChanged()));//内容改变后‘*’显示
//对文件进行操作(用流的形式打开文件)
myfile->setFileName(filename);
bool ret=myfile->open(QIODevice::ReadOnly|QIODevice::ReadOnly);
if(!ret){
QMessageBox::warning(this,"打开文件失败","打开文件失败");
}
QTextStream stream(myfile);
stream.setCodec(this->CodeName.toLocal8Bit().data());//编码格式
while(!stream.atEnd()){
QString str=stream.readLine();
this->append(str);
myfile->close();
}
}
int subText::SaveFile(){
int ret_data = -1;
if(!isEdit){
return ret_data;//没修改
}
//没名字的
if(this->filename.isEmpty()){
QString filename = QFileDialog::getSaveFileName(this,"保存提示",".","Text(*.cpp *.h *.txt)");
if(filename.isEmpty()){
return ret_data ;
}
this->filename = filename;
}
//对文件操作
myfile->setFileName(this->filename);
bool result= myfile->open(QIODevice::WriteOnly|QIODevice::Text);
if(!result){
QMessageBox::warning(this,"失败提示","打开文件失败");
return ret_data;
}
QTextStream stream(myfile);
stream.setCodec(this->CodeName.toLocal8Bit().data());//编码格式
stream<<this->toPlainText();
stream.flush();//刷入数据
myfile->close();
this->setWindowModified(false);//去除星号
isEdit = false;
QMessageBox::information(this,"成功提示","保存文件成功");
ret_data=0;
return ret_data;
}
void subText::SaveAsFile(){
bool isEdit = this->isEdit;
this->isEdit = true;
QString filename=this->filename;
this->filename.clear();
int ret = SaveFile();
if(ret<0){
this->isEdit = isEdit;
this->filename = filename;
}
}
void subText::setCodeName(const QString codename){
this->CodeName = codename;
}
/*function end*/
/*slots*/
void subText::doProcesscontentsChanged(){
isEdit = true;
this->setWindowModified(true);
}
/*slots end*/
//events
void subText::closeEvent(QCloseEvent *event){
if(!isEdit){//不处于编辑态
return;
}
QMessageBox::StandardButton ret;
ret=QMessageBox::information(this,"保存提示","确认是否保存",
QMessageBox::Yes|QMessageBox::Yes|QMessageBox::Cancel,QMessageBox::Yes);
if(ret==QMessageBox::Yes){
SaveFile();
event->accept();
}
else if (ret==QMessageBox::No) {
event->accept();
}
else if (ret==QMessageBox::Cancel) {
event->ignore();
}
}
5、subtext.h
#ifndef SUBTEXT_H
#define SUBTEXT_H
#include <QWidget>
#include <QTextEdit>
#include <QFileDialog>
#include <QFile>
#include <QMessageBox>
#include <QTextStream>//文本流
#include <QCloseEvent>
class subText : public QTextEdit
{
Q_OBJECT
public:
explicit subText(QWidget *parent = nullptr);
//文件
//子类里实现功能
void NewFile();//窗体新建
void OpenFile();//打开文件
void setCodeName(const QString codename);
int SaveFile();//保存文件
void SaveAsFile();//另存为文件
//编辑
//窗口
protected:
void closeEvent(QCloseEvent*);//关闭
signals:
public slots:
void doProcesscontentsChanged();
private:
QString filename;
QFile *myfile;
QString CodeName;
bool isEdit;
};
#endif // SUBTEXT_H