1、效果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7ec96ee279f9d15c9c2c71fdd3259217.png)
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;
}
void MainWindow::Init(){
codeName = "UTF-8";
connect(ui->action_New,SIGNAL(triggered(bool)),
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_Redo,SIGNAL(triggered(bool)),
this,SLOT(doProcessTriggeredByRedo(bool)));
connect(ui->action_Undo,SIGNAL(triggered(bool)),
this,SLOT(doProcessTriggeredByUndo(bool)));
connect(ui->action_Cut,SIGNAL(triggered(bool)),
this,SLOT(doProcessTriggeredByCut(bool)));
connect(ui->action_Copy,SIGNAL(triggered(bool)),
this,SLOT(doProcessTriggeredByCopy(bool)));
connect(ui->action_Pars,SIGNAL(triggered(bool)),
this,SLOT(doProcessTriggeredByPaste(bool)));
connect(ui->action_About,SIGNAL(triggered(bool)),
this,SLOT(doProcessTriggeredByAbout(bool)));
connect(ui->action_AboutQT,SIGNAL(triggered(bool)),
this,SLOT(doProcessTriggeredByAboutQT(bool)));
}
subText *MainWindow::getActiveChildForm(){
subText *sub = NULL;
QMdiSubWindow *subWin = ui->mdiArea->activeSubWindow();
if(subWin == NULL) return sub;
QWidget *wid = subWin->widget();
if(wid == NULL) return sub;
sub = (subText *)wid;
return sub;
}
void MainWindow::closeEvent(QCloseEvent *e){
doProcessTriggeredByExit(false);
}
void MainWindow::doProcessTriggeredByNew(bool){
qDebug()<<"triggered New action"<<endl;
subText *sub = new subText();
ui->mdiArea->addSubWindow((QWidget *)sub);
sub->setCodeName(codeName);
sub->NewFile();
sub->show();
}
void MainWindow::doProcessTriggeredByOpen(bool){
qDebug()<<"triggered open action"<<endl;
subText *sub = new subText();
ui->mdiArea->addSubWindow((QWidget *)sub);
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){
ui->mdiArea->closeAllSubWindows();
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");
}
void MainWindow::doProcessTriggeredByAboutQT(bool){
qDebug()<<"triggered AboutQT action"<<endl;
QMessageBox::about(this,"关于QT","qt by xx xx xx");
}
void MainWindow::doProcessTriggeredByRedo(bool){
qDebug()<<"triggered Redo action"<<endl;
subText *sub = getActiveChildForm();
if(sub!=NULL){
sub->redo();
}
}
void MainWindow::doProcessTriggeredByUndo(bool){
qDebug()<<"triggered Undo action"<<endl;
subText *sub = getActiveChildForm();
if(sub!=NULL){
sub->undo();
}
}
void MainWindow::doProcessTriggeredByCut(bool){
qDebug()<<"triggered Cut action"<<endl;
subText *sub = getActiveChildForm();
if(sub!=NULL){
sub->cut();
}
}
void MainWindow::doProcessTriggeredByPaste(bool){
qDebug()<<"triggered Paste action"<<endl;
subText *sub = getActiveChildForm();
if(sub!=NULL){
sub->paste();
}
}
void MainWindow::doProcessTriggeredByCopy(bool){
qDebug()<<"triggered Copy action"<<endl;
subText *sub = getActiveChildForm();
if(sub!=NULL){
sub->copy();
}
}
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();
protected:
void closeEvent(QCloseEvent *e);
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);
void doProcessTriggeredByRedo(bool);
void doProcessTriggeredByUndo(bool);
void doProcessTriggeredByCut(bool);
void doProcessTriggeredByCopy(bool);
void doProcessTriggeredByPaste(bool);
private:
Ui::MainWindow *ui;
QString codeName;
subText *getActiveChildForm();
void Init();
};
#endif
4、subtext.cpp
#include "subtext.h"
subText::subText(QWidget *parent) : QTextEdit(parent)
{
isEdit = false;
myfile = new QFile(this);
}
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;
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;
}
void subText::doProcesscontentsChanged(){
isEdit = true;
this->setWindowModified(true);
}
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();
}
}
void subText::contextMenuEvent(QContextMenuEvent *e){
QMenu *myMenu= new QMenu(this);
QAction *redo = myMenu->addAction(QIcon(":/new/prefix1/AFP.png"),
"撤销",this,SLOT(redo()),QKeySequence::Redo);
redo->setEnabled(this->document()->isUndoAvailable());
QAction *undo=myMenu->addAction(QIcon(":/new/prefix1/AFP.png"),
"恢复",this,SLOT(undo()),QKeySequence::Undo);
undo->setEnabled(this->document()->isRedoAvailable());
myMenu->addSeparator();
QAction *cut=myMenu->addAction(QIcon(":/new/prefix1/AFP.png"),
"剪切",this,SLOT(cut()),QKeySequence::Cut);
cut->setEnabled(this->textCursor().hasSelection());
QAction *copy=myMenu->addAction(QIcon(":/new/prefix1/AFP.png"),
"复制",this,SLOT(copy()),QKeySequence::Copy);
copy->setEnabled(this->textCursor().hasSelection());
myMenu->addAction(QIcon(":/new/prefix1/AFP.png"),
"粘贴",this,SLOT(paste()),QKeySequence::Paste);
myMenu->addSeparator();
QAction *clear=myMenu->addAction(QIcon(":/new/prefix1/AFP.png"),
"清除",this,SLOT(clear()),QKeySequence(tr("Ctrl+D")));
clear->setEnabled(!this->document()->isEmpty());
QAction *select_all=myMenu->addAction(QIcon(":/new/prefix1/AFP.png"),
"全选",this,SLOT(selectAll()),QKeySequence::SelectAll);
select_all->setEnabled(!this->document()->isEmpty());
myMenu->exec(e->globalPos());
}
5、subtext.h
#ifndef SUBTEXT_H
#define SUBTEXT_H
#include <QWidget>
#include <QTextEdit>
#include <QFileDialog>
#include <QFile>
#include <QMessageBox>
#include <QTextStream>
#include <QCloseEvent>
#include <QContextMenuEvent>
#include <QMenu>
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*);
void contextMenuEvent(QContextMenuEvent *e);
signals:
public slots:
void doProcesscontentsChanged();
private:
QString filename;
QFile *myfile;
QString CodeName;
bool isEdit;
};
#endif