学了好久Qt了,一直感觉没怎么学会,应该还是练得少。先来个简单的文本编辑器,可惜一次只能编辑一个文本,没有状态栏。下次写个多文本的试试。
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTextEdit>
#include <QString>
#include <QMenuBar>
#include <QAction>
#include <QMenu>
#include <QFile>
#include <QFontDialog>
#include <QCloseEvent>
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
QTextEdit* textEdit;
QMenuBar* menuBar;
QMenu *file,*edit,*about;
QAction *newFile,*openFile,*saveFile,*saveFileAs,*exit;
QAction *redo,*undo,*cut,*copy,*paste,*font,*author;
//新建文件,flag为1
//打开已存在的文件,flag为2
int flag;
QString curFile;
//检查当前文件是否保存
bool maybesave();
bool savefile(const QString&);
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void closeEvent(QCloseEvent *event);
private slots:
void aboutAuthor();
void newfile();
void openfile();
void closeEditor();
bool savefileas();
bool save();
void Redo();
void Undo();
void Cut();
void Copy();
void Paste();
void setTextFont();
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include <QTextEdit>
#include <QMessageBox>
#include <QMenuBar>
#include <QDebug>
#include <QPushButton>
#include <QMenu>
#include <QString>
#include <QFile>
#include <QTextStream>
#include <QFileDialog>
#include <QAction>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//初始化文件名
curFile = tr("未命名.txt");
setWindowTitle(curFile);
this->resize(QSize(800,600));
textEdit = new QTextEdit();
setCentralWidget(textEdit);
menuBar = new QMenuBar(this);
file = new QMenu("File",this);
edit = new QMenu("Edit",this);
about = new QMenu("About",this);
newFile = new QAction("New",this);
openFile = new QAction("Open",this);
saveFile = new QAction("Save File",this);
saveFileAs = new QAction("Save File As",this);
exit = new QAction("Exit",this);
redo = new QAction("Redo",this);
undo = new QAction("Undo",this);
cut = new QAction("Cut",this);
copy = new QAction("Copy",this);
paste = new QAction("Paste",this);
font = new QAction("Font",this);
author = new QAction("Author",this);
file->addAction(newFile);
file->addAction(openFile);
file->addAction(saveFile);
file->addAction(saveFileAs);
file->addAction(exit);
edit->addAction(redo);
edit->addAction(undo);
edit->addAction(cut);
edit->addAction(copy);
edit->addAction(paste);
edit->addAction(font);
about->addAction(author);
menuBar->addMenu(file);
menuBar->addMenu(edit);
menuBar->addMenu(about);
setMenuBar(menuBar);
//新建文件
connect(newFile,&QAction::triggered,this,&newfile);
//打开文件
connect(openFile,&QAction::triggered,this,&openfile);
//保存文件
connect(saveFile,&QAction::triggered,this,&save);
//文件另存为
connect(saveFileAs,&QAction::triggered,this,&savefileas);
//关于作者
connect(author,&QAction::triggered,this,&aboutAuthor);
//关闭编辑器
connect(exit,&QAction::triggered,this,&closeEditor);
//恢复
connect(redo,&QAction::triggered,this,&Redo);
//撤销
connect(undo,&QAction::triggered,this,&Undo);
//剪切
connect(cut,&QAction::triggered,this,&Cut);
//复制
connect(copy,&QAction::triggered,this,&Copy);
//粘贴
connect(paste,&QAction::triggered,this,&Paste);
//选择字体
connect(font,&QAction::triggered,this,&setTextFont);
}
MainWindow::~MainWindow()
{
delete redo;
delete undo;
delete cut;
delete copy;
delete paste;
delete font;
delete author;
delete newFile;
delete openFile;
delete saveFile;
delete saveFileAs;
delete exit;
delete file;
delete edit;
delete about;
delete menuBar;
delete textEdit;
}
void MainWindow::aboutAuthor()
{
QMessageBox::information(this,"About Author","i am yong heng");
return ;
}
//新建文件
void MainWindow::newfile()
{
//新建文件的时候要判断当前文件是否保存
if(maybesave())
{
curFile = tr("未命名.txt");
flag = 1;
setWindowTitle(curFile);
textEdit->clear();
textEdit->setVisible(true);
}
}
//打开文件 最好也要先检查一下当前文件是否保存
void MainWindow::openfile()
{
flag = 2;
curFile = QFileDialog::getOpenFileName(this,tr("Open File"),".",tr("Text(*.txt)"));
QFile file(curFile);
//我不检查文件是否存在了
file.open(QIODevice::ReadOnly);
QTextStream mcin(&file);
textEdit->setText(mcin.readAll());
file.close();
return ;
}
//文件另存为
bool MainWindow::savefileas()
{
QString filename = QFileDialog::getSaveFileName(this,tr("Svae File As"),curFile,tr("Text(*.txt)"));
if(filename.isEmpty())
return false;
return savefile(filename);
}
//判断当前文件是否保存
bool MainWindow::maybesave()
{
if(textEdit->document()->isModified())
{
QMessageBox box;
box.setWindowTitle(tr("warning"));
box.setIcon(QMessageBox::Warning);
box.setText(curFile + tr(" 文件还未保存,是否保存?"));
QPushButton *yesBtn = box.addButton(tr("yes(&Y)"),
QMessageBox::YesRole);
box.addButton(tr("no(&N)"),QMessageBox::NoRole);
QPushButton *cancelBut = box.addButton(tr("calcel"),
QMessageBox::RejectRole);
box.exec();
if(box.clickedButton() == yesBtn)
{
if(flag == 2)
return save();
else
return savefileas();
}
else if(box.clickedButton() == cancelBut)
return false;
}
return true;
}
//保存文件
bool MainWindow::save()
{
if(textEdit->document()->isModified())
{
if(flag == 2)
{
QFile nowFile(curFile);
nowFile.open(QFile::WriteOnly | QFile::Text);
QTextStream out(&nowFile);
out << textEdit->toPlainText();
nowFile.close();
}
else
{
savefileas();
}
}
return true;
}
bool MainWindow::savefile(const QString& filename)
{
QFile file(filename);
file.open(QFile::WriteOnly | QFile::Text);
QTextStream out(&file);
out << textEdit->toPlainText();
file.close();
return true;
}
//关闭程序的时候判断文件是否保存
void MainWindow::closeEditor()
{
if(maybesave())
this->close();
}
void MainWindow::Redo()
{
textEdit->redo();
}
void MainWindow::Undo()
{
textEdit->undo();
}
void MainWindow::Cut()
{
textEdit->cut();
}
void MainWindow::Copy()
{
textEdit->copy();
}
void MainWindow::Paste()
{
textEdit->paste();
}
void MainWindow::setTextFont()
{
bool ok;
QFont font = QFontDialog::getFont(&ok,this);
if(ok)
textEdit->setFont(font);
}
void MainWindow::closeEvent(QCloseEvent *event)
{
if(maybesave())
event->accept();
else
event->ignore();
}