编程练习:记事本

核心逻辑:采用C++,界面库:用的QT,如下


文件目录:



执行程序:



核心代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtGui>
#include <windows.h>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //初始化
    isAutoChangeLine=false;  //初始不自动换行
    ui->action_ChangeLine->setChecked(isAutoChangeLine);
    isSaved=false;  //初始文件为未保存状态
    curFileName=tr("未命名.txt");
    setWindowTitle(curFileName);    //初始化主窗口的标题
    setWindowIcon(QIcon(":/icoFile/images/formico.png"));
    ui->textEdit->setFontFamily("Arial");//默认字体
    ui->textEdit->setTextColor("Black");//默认颜色

    init_statusBar();//状态栏
    connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(do_cursorChanged()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

//新建
void MainWindow::do_file_New()
{
    do_file_SaveOrNot();    //新建前,修改的文件是否保存
    isSaved=false;
    curFileName=tr("未命名.txt");
    setWindowTitle(curFileName);
    ui->textEdit->clear();
    ui->textEdit->setVisible(true); //文本编辑器可见
    ui->textEdit->setFontFamily("Arial");//默认字体
    ui->textEdit->setTextColor("Black");//默认颜色
}

//新建前,修改的文件是否保存
void MainWindow::do_file_SaveOrNot()
{
    //如果被修改过,弹出保存对话框
    if(ui->textEdit->document()->isModified())
    {
        QMessageBox msgBox;
        msgBox.setWindowTitle(tr("警告"));
        msgBox.setIcon(QMessageBox::Warning);
        msgBox.setText(curFileName+tr("尚未保存,是否保存?"));
        msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No);
        //如果选择保存,则执行保存动作
        if(msgBox.exec()==QMessageBox::Yes)
        {
            do_file_Save();
        }
    }
}

//保存
void MainWindow::do_file_Save()
{
    //如果已经被保存过,直接保存
    if(isSaved)
    {
        saveFile(curFileName);
    }
    //否则,调用另存为
    else
    {
        do_file_SaveAs();
    }
}

//另存为
void MainWindow::do_file_SaveAs()
{
    QString fileName=QFileDialog::getSaveFileName(this,tr("另存为"),curFileName,tr("文本文件 (*.txt);;All files(*.*)"));
    //如果文件名非空,则保存
    if(!fileName.isEmpty())
    {
        saveFile(fileName);
    }
}

//保存操作
bool MainWindow::saveFile(const QString &fileName)
{
    //定义1个QFile对象file
    QFile file(fileName);
    //以只写方式打开文件,如果打开失败弹出提示,提前返回
    if(!file.open(QFile::WriteOnly|QFile::Text))
    {
        QMessageBox::warning(this,
                             tr("保存文件"),
                             tr("无法保存文件%1:\n%2").arg(fileName).arg(file.errorString())
                             ); //%1,%2表示后面两个参数
        return false;
    }
    //正常,新建流对象,指向选定文件
    QTextStream out(&file);
    //将文本编辑器中的内容以纯文本的形式输出到流对象中
    out<<ui->textEdit->toPlainText();
    isSaved=true;
    //文本编辑器变化状态重置
    ui->textEdit->document()->setModified(false);
    //获取文件的标准路径
    curFileName=QFileInfo(fileName).canonicalFilePath();
    //获取文件名,包括后缀
    curFileNameWithOutPath=QFileInfo(fileName).fileName();
    //主窗口名称改为现在的路径
    setWindowTitle(curFileNameWithOutPath);
    second_statusLabel->setText(tr("保存文件成功"));
    return true;
}

//打开文件
void MainWindow::do_file_Open()
{
    do_file_SaveOrNot();
    QString fileName=QFileDialog::getOpenFileName(this,tr("打开文件"),QDir::currentPath(),tr("文本文件 (*.txt);;All files(*.*)"));//getOpenFileName(this)
    //如果文件名不为空
    if(!fileName.isEmpty())
    {
        do_file_Load(fileName);
        curFileName=QFileInfo(fileName).canonicalFilePath();
        //获取文件名,包括后缀
        curFileNameWithOutPath=QFileInfo(fileName).fileName();
        //主窗口名称改为现在的路径
        setWindowTitle(curFileNameWithOutPath);
        second_statusLabel->setText(tr("打开文件成功"));
        //被保存过
        isSaved=true;
        //文本编辑器可见
        ui->textEdit->setVisible(true);
    }
}

//读取文件
bool MainWindow::do_file_Load(const QString &fileName)
{
    QFile file(fileName);
    if(!file.open(QFile::ReadOnly|QFile::Text))
    {
        QMessageBox::warning(this,
                             tr("读取文件"),
                             tr("无法读取文件%1:\n%2").arg(fileName).arg(file.errorString())
                             );
        return false;
    }
    QTextStream in(&file);
    ui->textEdit->setText(in.readAll());
    curFileName=QFileInfo(fileName).fileName();
    setWindowTitle(curFileName);
    second_statusLabel->setText(tr("打开文件成功!"));
    return true;
}

槽函数
//新建
void MainWindow::on_action_New_triggered()
{
    do_file_New();
}
//保存
void MainWindow::on_action_Save_triggered()
{
    do_file_Save();
}
//另存为
void MainWindow::on_action_SaveAs_triggered()
{
    do_file_SaveAs();
}
//打开
void MainWindow::on_action_Open_triggered()
{
    do_file_Open();
}
//关闭
void MainWindow::on_action_Close_triggered()
{
    do_file_SaveOrNot();
    curFileName="";
    curFileNameWithOutPath="";
    //文本编辑器变化状态重置
    ui->textEdit->document()->setModified(false);
    ui->textEdit->setVisible(false);
    first_statusLabel->setText(tr("文本编辑器已经关闭"));
    second_statusLabel->setText(tr("KAKASI制作!"));
}
//退出
void MainWindow::on_action_Quit_triggered()
{
    //先执行关闭动作
    on_action_Close_triggered();
    //再退出系统,qApp是指向应用程序的全局指针
    qApp->quit();
}
//撤销
void MainWindow::on_action_Undo_triggered()
{
    ui->textEdit->undo();
}
//剪贴
void MainWindow::on_action_Cut_triggered()
{
    ui->textEdit->cut();
}
//复制
void MainWindow::on_action_Copy_triggered()
{
    ui->textEdit->setFontFamily("Arial");//默认字体
    ui->textEdit->setTextColor("Black");//默认颜色
    ui->textEdit->copy();
}
//粘贴
void MainWindow::on_action_Paste_triggered()
{
    ui->textEdit->paste();
}


//查找
void MainWindow::on_action_Find_triggered()
{
    //新建1个对话框,用于查找操作,this表明父窗口为MainWindow
    QDialog *findDlg=new QDialog(this);
    findDlg->setWindowTitle(tr("查找"));

    find_textLineEdit=new QLineEdit(findDlg);
    QPushButton *find_Btn=new QPushButton(tr("查找下一个"),findDlg);

    QVBoxLayout *layout=new QVBoxLayout(findDlg);
    layout->addWidget(find_textLineEdit);
    layout->addWidget(find_Btn);

    findDlg->show();

    connect(find_Btn,SIGNAL(clicked()),this,SLOT(show_findText()));
    second_statusLabel->setText(tr("正在进行查找"));
}
//查找
void MainWindow::show_findText()
{
    QString findText=find_textLineEdit->text();
    if(!ui->textEdit->find(findText,QTextDocument::FindBackward))
    {
        QMessageBox::warning(this,tr("查找"),tr("找不到%1").arg(findText));
    }
}

//
void MainWindow::init_statusBar()
{
    QStatusBar *bar=ui->statusBar;
    first_statusLabel=new QLabel;
    first_statusLabel->setMinimumSize(150,20);//最小尺寸
    first_statusLabel->setFrameShape(QFrame::NoFrame);//形状WinPanel//
    first_statusLabel->setFrameShadow(QFrame::Plain);//阴影//Sunken
    second_statusLabel=new QLabel;
    second_statusLabel->setMinimumSize(150,20);//最小尺寸
    second_statusLabel->setFrameShape(QFrame::NoFrame);//形状
    second_statusLabel->setFrameShadow(QFrame::Plain);//阴影
    bar->addWidget(first_statusLabel);
    bar->addWidget(second_statusLabel);
    first_statusLabel->setText(tr("欢迎使用文本编辑器"));
    second_statusLabel->setText(tr("KAKASI制作!"));
}

//
void MainWindow::do_cursorChanged()
{
    //行号
    int rowNum=ui->textEdit->document()->blockCount();
    const QTextCursor cursor=ui->textEdit->textCursor();
    //列号
    int colNum=cursor.columnNumber();
    first_statusLabel->setText(tr("%1行 %2列").arg(rowNum).arg(colNum));
}
//记事本
void MainWindow::on_action_Windows_NotePad_triggered()
{
    UINT s=WinExec("notepad.exe", SW_SHOW);
    s=0;
    //UINT to QString
    //QString b;
    //b=QString::number(s);
    //QString to char
    //char *ch;
    //ch =b.toLatin1().data();
    if(s<=31)QMessageBox::warning(this,tr("提示"),tr("执行状态:%1").arg(s));
}
//自动换行
void MainWindow::on_action_ChangeLine_triggered()
{
    if(!isAutoChangeLine)//如果没自动换行,则自动换行
    {
        ui->textEdit->setLineWrapMode(QTextEdit::WidgetWidth);;
    }
    else
    {
        ui->textEdit->setLineWrapMode(QTextEdit::NoWrap);;
    }
    //状态切换
    isAutoChangeLine=!isAutoChangeLine;
    ui->action_ChangeLine->setChecked(isAutoChangeLine);
}
//About
void MainWindow::on_action_Version_triggered()
{
    QMessageBox::information(this,tr("版本"),"卡卡西V1.0",QMessageBox::Ok);
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值