用Qt实现一个多功能记事本,
功能 :布局对齐,字体变换,颜色改变.
格式 :自动保存为rtf格式,支持txt格式,兼容MS Word打开.
涉及知识 :文件保存过滤器的使用,文件的输入输出流,光标的控制
可能会有一些小Bug
效果图如下:
/*---------------MyNotepad.h--------------------*/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
#include
#include
#include
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
void mergeFormat(QTextCharFormat fmt);
bool boldcheck;
bool Italiccheck;
bool UnderLinecheck;
private:
QAction *fileNew;
QAction *fileOpen;
QAction *fileExit;
QAction *fileSave;
QAction *copyAct;
QAction *pasteAct;
QAction *cutAct;
QAction *fontAct;
QAction *colAct;
QAction *selAct;
QAction *timeAct;
QAction *boldAct;
QAction *underAct;
QAction *italicAct;
QAction *leftAct;
QAction *rightAct;
QAction *centerAct;
QAction *about;
QAction *aboutAuthor;
QMenu *Menu;
QTextEdit *textEdit;
QLabel *lableft;
QLabel *labright;
void closeEvent(QCloseEvent *event);
private slots:
void newfile();
void openfile();
void exitfile();
void savefile();
void copyword();
void cutword();
void pasteword();
void selslot();
void colslot();
void fontslot();
void timeslot();
void italicslot();
void underslot();
void boldslot();
void showabout();
void layoutLeft();
void layoutRight();
void layoutCenter();
void showauthor();
};
#endif // MAINWINDOW_H
/*---------------MyNotepad.h--------------------*/
/*---------------MyNotepad.cpp--------------------*/
#include "mainwindow.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
fileNew = new QAction(tr("新建"),this);
fileNew->setShortcut(tr("Ctrl+N"));
fileOpen = new QAction(tr("打开"),this);
fileOpen->setShortcut(tr("Ctrl+O"));
fileExit = new QAction(tr("退出"),this);
fileExit->setShortcut(tr("Ctrl+Q"));
fileSave = new QAction(tr("保存"),this);
fileSave->setShortcut(tr("Ctrl+S"));
copyAct = new QAction(tr("复制"),this);
copyAct->setShortcut(tr("Ctrl+C"));
pasteAct = new QAction(tr("粘贴"),this);
pasteAct->setShortcut(tr("Ctrl+V"));
cutAct = new QAction(tr("剪切"),this);
cutAct->setShortcut(tr("Ctrl+X"));
selAct = new QAction(tr("全选"),this);
selAct->setShortcut(tr("Ctrl+A"));
fontAct = new QAction(tr("改变字体"),this);
fontAct->setShortcut(tr("Alt+F"));
colAct = new QAction(tr("添加颜色"),this);
colAct->setShortcut(tr("Alt+C"));
timeAct = new QAction(tr("当前时间"),this);
timeAct->setShortcut(tr("F5"));
boldAct = new QAction(tr("加粗"),this);
boldAct->setShortcut(tr("Ctrl+B"));
italicAct = new QAction(tr("斜体"),this);
italicAct->setShortcut(tr("Ctrl+I"));
underAct= new QAction(tr("下划线"),this);
underAct->setShortcut(tr("Ctrl+U"));
leftAct = new QAction(tr("左对齐"),this);
leftAct->setShortcut(tr("Ctrl+L"));
rightAct = new QAction(tr("右对齐"),this);
rightAct->setShortcut(tr("Ctrl+R"));
centerAct = new QAction(tr("居中"),this);
centerAct->setShortcut(tr("Ctrl+E"));
about = new QAction(tr("关于"),this);
aboutAuthor = new QAction(tr("关于作者"),this);
Menu = menuBar()->addMenu(tr("文件(&D)"));
Menu->addAction(fileNew);
Menu->addAction(fileOpen);
Menu->addAction(fileSave);
Menu->addSeparator();
Menu->addAction(fileExit);
Menu = menuBar()->addMenu(tr("编辑(&E)"));
Menu->addAction(copyAct);
Menu->addAction(cutAct);
Menu->addAction(pasteAct);
Menu->addAction(selAct);
Menu = menuBar()->addMenu(tr("功能(&O)"));
Menu->addAction(boldAct);
Menu->addAction(italicAct);
Menu->addAction(underAct);
Menu->addSeparator();
Menu->addAction(fontAct);
Menu->addAction(colAct);
Menu->addAction(timeAct);
Menu = menuBar()->addMenu(tr("布局(&V)"));
Menu->addAction(centerAct);
Menu->addAction(leftAct);
Menu->addAction(rightAct);
Menu = menuBar()->addMenu(tr("帮助(&H)"));
Menu->addAction(about);
Menu->addAction(aboutAuthor);
boldcheck = true;
Italiccheck = true;
UnderLinecheck = true;
QFont font1("Microsoft YaHei", 12);
textEdit = new QTextEdit;
textEdit->setFont(font1);
textEdit->acceptRichText();
//textEdit->setStyleSheet("background-color: #C7EDCC;");
this->setWindowTitle(tr("萌萌哒o(≧∇≦o)~Editer"));
this->resize(750,550);
this->layout()->setMargin(20);
this->setCentralWidget(textEdit);
this->setWindowIcon(QIcon(":/notepad.ico"));
connect(fileNew, SIGNAL(triggered()), this, SLOT(newfile()));
connect(fileOpen, SIGNAL(triggered()), this, SLOT(openfile()));
connect(fileExit, SIGNAL(triggered()), this, SLOT(exitfile()));
connect(fileSave, SIGNAL(triggered()), this, SLOT(savefile()));
connect(copyAct, SIGNAL(triggered()), this, SLOT(copyword()));
connect(cutAct, SIGNAL(triggered()), this, SLOT(cutword()));
connect(pasteAct, SIGNAL(triggered()), this, SLOT(pasteword()));
connect(boldAct, SIGNAL(triggered()), this, SLOT(boldslot()));
connect(italicAct, SIGNAL(triggered()), this, SLOT(italicslot()));
connect(underAct, SIGNAL(triggered()), this, SLOT(underslot()));
connect(fontAct, SIGNAL(triggered()), this, SLOT(fontslot()));
connect(colAct, SIGNAL(triggered()), this, SLOT(colslot()));
connect(selAct, SIGNAL(triggered()), this, SLOT(selslot()));
connect(timeAct, SIGNAL(triggered()), this,SLOT(timeslot()));
connect(leftAct, SIGNAL(triggered()), this, SLOT(layoutLeft()));
connect(rightAct, SIGNAL(triggered()), this, SLOT(layoutRight()));
connect(centerAct, SIGNAL(triggered()), this, SLOT(layoutCenter()));
connect(aboutAuthor, SIGNAL(triggered()), this, SLOT(showauthor()));
connect(about, SIGNAL(triggered()), this, SLOT(showabout()));
}
MainWindow::~MainWindow()
{
}
void MainWindow::newfile()
{
if(textEdit->document()->isModified())
{
if( "" != textEdit->toPlainText() )
{
QMessageBox::StandardButton select = QMessageBox::question(this, "",tr("是否要保存文件内容?"),
QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel,QMessageBox::Yes);
if(select == QMessageBox::Yes)
{
savefile();
textEdit->clear();
}
if(select == QMessageBox::No)
{
textEdit->clear();
}
if(select == QMessageBox::Cancel)
{
;
}
}
}
}
void MainWindow::openfile()
{
QString filename = QFileDialog::getOpenFileName(this, tr("打开文件"),
QDir::currentPath(),
tr("富文本(*.rtf);;纯文本(*.txt)"));
QString Path(filename);
char *Tmppath = (char *)filename.toStdString().data();
for(int i = filename.length(); i > 0; --i)
{
if(Tmppath[i-1] == '/')
{
Tmppath += i;
break;
}
}
Path.sprintf("%s - %s",Tmppath, "萌萌哒o(≧∇≦o)~Editer" );
setWindowTitle(Path);
QFile file(filename);
if(file.open(QFile::ReadWrite))
{
textEdit->clear();
QTextStream stream(&file);
if(!stream.atEnd())
{
textEdit->setText(stream.readAll());
}
}
}
void MainWindow::exitfile()
{
close();
}
void MainWindow::savefile()
{
QFileDialog dialog(this,"保存文件","C:\\Users\\Administrator\\Desktop"
,tr("富文本(*.rtf);;纯文本(*.txt)"));
dialog.setAcceptMode(QFileDialog::AcceptSave);
QString filterMod;
QString fileName;
if(dialog.exec())
{
fileName = dialog.selectedFiles()[0];
filterMod = dialog.selectedNameFilter();
}
QFile file(fileName);
if(file.open(QFile::WriteOnly |QFile::Truncate))
{
QTextStream stream(&file);
if("富文本(*.rtf)" == filterMod)
stream<toHtml().toUtf8();
if("纯文本(*.txt)" == filterMod)
{
QMessageBox::StandardButton button =
QMessageBox::warning(this, tr("提示"),
QString(tr("保存为纯文本格式,颜色、字体等属性会丢失。\n确定要这样做么?")),
QMessageBox::Yes|QMessageBox::No,QMessageBox::No);
if(button == QMessageBox::Yes)
{
stream<toPlainText().toUtf8();
}
else
{
;
}
}
}
file.close();
}
void MainWindow::closeEvent(QCloseEvent *event)
{
QMessageBox::StandardButton button =
QMessageBox::question(this, tr("退出程序"),QString(tr("是否退出")),
QMessageBox::Yes|QMessageBox::No,QMessageBox::No);
if(button == QMessageBox::Yes)
{
event->accept();
}
else
{
event->ignore();
}
}
void MainWindow::copyword()
{
textEdit->copy();
}
void MainWindow::cutword()
{
textEdit->cut();
}
void MainWindow::pasteword()
{
textEdit->paste();
}
void MainWindow::selslot()
{
textEdit->selectAll();
}
void MainWindow::colslot()
{
const QColorDialog::ColorDialogOptions options = QFlag(QColorDialog::ShowAlphaChannel);
const QColor color = QColorDialog::getColor(Qt::green, this, tr("选择颜色"), options);
if (color.isValid())
{
textEdit->setTextColor(color);
}
}
void MainWindow::fontslot()
{
bool ok;
QFont font = QFontDialog::getFont(
&ok, QFont(tr("微软雅黑"), 15), this);
if (ok)
{
//textEdit->setFont(font);
QTextCharFormat fmt;
fmt.setFont(font);
mergeFormat(fmt);
} else
{
;
}
}
void MainWindow::timeslot()
{
textEdit->append(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
}
//设置光标的选区,使格式作用于选区内的字符
void MainWindow::mergeFormat(QTextCharFormat fmt)
{
QTextCursor cursor = textEdit->textCursor();
if (!cursor.hasSelection()) {
cursor.select(QTextCursor::WordUnderCursor);
}
cursor.mergeCharFormat(fmt);
}
//加粗
void MainWindow::boldslot()
{
QTextCharFormat fmt;
fmt.setFontWeight(boldcheck ? QFont::Bold : QFont::Normal);
mergeFormat(fmt);
boldcheck = !boldcheck;
}
//倾斜
void MainWindow::italicslot()
{
QTextCharFormat fmt;
fmt.setFontItalic(Italiccheck ? true : false);
mergeFormat(fmt);
Italiccheck = !Italiccheck;
}
//下划线
void MainWindow::underslot()
{
QTextCharFormat fmt;
fmt.setFontUnderline(UnderLinecheck ? true : false);
mergeFormat(fmt);
UnderLinecheck = !UnderLinecheck;
}
//左对齐
void MainWindow::layoutLeft()
{
if ( textEdit->alignment() != Qt::AlignLeft )
textEdit->setAlignment(Qt::AlignLeft);
else
textEdit->setAlignment( textEdit->alignment() ^ Qt::AlignLeft);
}
//居中对齐
void MainWindow::layoutCenter()
{
if ( textEdit->alignment() != Qt::AlignCenter )
textEdit->setAlignment(Qt::AlignCenter);
else
textEdit->setAlignment( textEdit->alignment() ^ Qt::AlignCenter);
}
void MainWindow::showauthor()
{
QDesktopServices::openUrl(QUrl("http://blog.csdn.net/sinat_29173167"));
}
//右对齐
void MainWindow::layoutRight()
{
if ( textEdit->alignment() != Qt::AlignRight )
textEdit->setAlignment(Qt::AlignRight);
else
textEdit->setAlignment( textEdit->alignment() ^ Qt::AlignRight);
}
void MainWindow::showabout()
{
QDialog *w;
w = new QDialog(this);
w->setWindowTitle(tr("关于 - 萌萌哒o(≧∇≦o)~Editer"));
w->setFixedHeight(200);
w->setFixedWidth(400);
QMovie *gif = new QMovie(":/panda.gif");
lableft = new QLabel(w);
lableft->setMovie(gif);
//lableft->setSizePolicy(QSizePolicy::horizontalPolicy(),QSizePolicy::verticalStretch());
//lableft->resize(gif->width(),gif->height());
gif->start();
labright = new QLabel(w);
QFont ft("Microsoft YaHei", 10);
ft.setBold(25);
labright->setFont(ft);
labright->setText(tr("Plantform: Win/Linux\n\nAll Copyleft Reseverd."));
QHBoxLayout *layout = new QHBoxLayout(w);
layout->setSpacing(25);
layout->setMargin(10);
layout->addWidget(lableft);
layout->addWidget(labright);
w->exec();
delete w;
}
/*---------------MyNotepad.cpp--------------------*/
/*---------------main.cpp--------------------*/
#include "mainwindow.h"
#include
#include
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
/*---------------main.cpp--------------------*/