您的位置:首页 > 编程语言

编程练习:记事本

2014-07-03 21:23 260 查看
核心逻辑:采用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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++