6_5_notepad右键菜单功能

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_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)),//关于QT
            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;
}
/*function end*/


/*event*/
//主窗体关闭事件
void MainWindow::closeEvent(QCloseEvent *e){
    doProcessTriggeredByExit(false);//用槽当普通函数使用
}
/*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){
    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");
}
//关于QT
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();
     }
}




/*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();
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 // 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();
    }
}

//右键功能
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 // SUBTEXT_H


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值