6_4_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_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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的记事本 Java 代码,实现了新建、打开、保存另存为退出功能: ```java import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.UIManager; import javax.swing.filechooser.FileNameExtensionFilter; public class Notepad extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; private JTextArea textArea; private JFileChooser fileChooser; private String fileName; public Notepad() { super("记事本"); // 设置菜单栏 JMenuBar menuBar = new JMenuBar(); JMenu fileMenu = new JMenu("文件"); JMenuItem newMenuItem = new JMenuItem("新建"); JMenuItem openMenuItem = new JMenuItem("打开"); JMenuItem saveMenuItem = new JMenuItem("保存"); JMenuItem saveAsMenuItem = new JMenuItem("另存为"); JMenuItem exitMenuItem = new JMenuItem("退出"); newMenuItem.addActionListener(this); openMenuItem.addActionListener(this); saveMenuItem.addActionListener(this); saveAsMenuItem.addActionListener(this); exitMenuItem.addActionListener(this); fileMenu.add(newMenuItem); fileMenu.add(openMenuItem); fileMenu.add(saveMenuItem); fileMenu.add(saveAsMenuItem); fileMenu.addSeparator(); fileMenu.add(exitMenuItem); menuBar.add(fileMenu); setJMenuBar(menuBar); // 设置文本区域 textArea = new JTextArea(); JScrollPane scrollPane = new JScrollPane(textArea); getContentPane().add(scrollPane, BorderLayout.CENTER); // 设置文件选择器 fileChooser = new JFileChooser(); fileChooser.setFileFilter(new FileNameExtensionFilter("文本文件(*.txt)", "txt")); // 设置窗口 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(800, 600); setLocationRelativeTo(null); setVisible(true); } public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } new Notepad(); } @Override public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); switch (command) { case "新建": newFile(); break; case "打开": openFile(); break; case "保存": saveFile(); break; case "另存为": saveAsFile(); break; case "退出": exit(); break; } } // 新建文件 private void newFile() { if (textArea.getText().length() > 0) { int option = JOptionPane.showConfirmDialog(this, "是否保存更改?", "记事本", JOptionPane.YES_NO_CANCEL_OPTION); if (option == JOptionPane.YES_OPTION) { saveFile(); } else if (option == JOptionPane.CANCEL_OPTION) { return; } } textArea.setText(""); fileName = null; } // 打开文件 private void openFile() { if (textArea.getText().length() > 0) { int option = JOptionPane.showConfirmDialog(this, "是否保存更改?", "记事本", JOptionPane.YES_NO_CANCEL_OPTION); if (option == JOptionPane.YES_OPTION) { saveFile(); } else if (option == JOptionPane.CANCEL_OPTION) { return; } } int result = fileChooser.showOpenDialog(this); if (result == JFileChooser.APPROVE_OPTION) { try { File file = fileChooser.getSelectedFile(); fileName = file.getAbsolutePath(); BufferedReader reader = new BufferedReader(new FileReader(file)); String line = null; StringBuilder sb = new StringBuilder(); while ((line = reader.readLine()) != null) { sb.append(line); sb.append(System.lineSeparator()); } reader.close(); textArea.setText(sb.toString()); } catch (Exception e) { e.printStackTrace(); } } } // 保存文件 private void saveFile() { if (fileName == null) { saveAsFile(); } else { try { BufferedWriter writer = new BufferedWriter(new FileWriter(fileName)); writer.write(textArea.getText()); writer.close(); } catch (Exception e) { e.printStackTrace(); } } } // 另存为文件 private void saveAsFile() { int result = fileChooser.showSaveDialog(this); if (result == JFileChooser.APPROVE_OPTION) { try { File file = fileChooser.getSelectedFile(); if (!file.getName().endsWith(".txt")) { file = new File(file.getAbsolutePath() + ".txt"); } fileName = file.getAbsolutePath(); BufferedWriter writer = new BufferedWriter(new FileWriter(file)); writer.write(textArea.getText()); writer.close(); } catch (Exception e) { e.printStackTrace(); } } } // 退出程序 private void exit() { if (textArea.getText().length() > 0) { int option = JOptionPane.showConfirmDialog(this, "是否保存更改?", "记事本", JOptionPane.YES_NO_CANCEL_OPTION); if (option == JOptionPane.YES_OPTION) { saveFile(); } else if (option == JOptionPane.CANCEL_OPTION) { return; } } System.exit(0); } } ``` 该记事本实现了新建、打开、保存另存为退出功能,可以选择文本文件进行编辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值