代码语言:javascript复制
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMenu>
#include <QAction>
#include <QFont>
#include <QToolBar>
#include <QLabel>
#include <QComboBox>
#include <QLineEdit>
#include <QTextEdit>
#include <QPrinter>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QActionGroup>
#include <QPrintDialog>
#include <QPushButton>
#include <QToolButton>
#include <QTextStream>
#include <QMessageBox>
#include <QTextCodec>
#include <QMainWindow>
#include <QFileDialog>
#include <QFontDialog>
#include <QInputDialog>
#include <QFontDatabase>
#include <QFontComboBox>
#include <QColorDialog>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
void createAction();
void createMenu();
void createToolBar();
void fileRead();//读文件
void fileWrite();//写文件
~MainWindow();
public:
Ui::MainWindow *ui;
QMenu *file;
QMenu *edit;
QMenu *style;
QMenu *insert;//插入菜单
QMenu *search;//查找菜单
QMenu *help;//帮助菜单
QToolBar *fileToolBar;
QToolBar *editToolBar;
QToolBar *styleToolBar;
QToolBar *insertToolBar;
QToolBar *searchToolBar;
QToolBar *helpToolBar;
QTextEdit *textEdit;
QAction *newFile;
QAction *openFile;
QAction *save;
QAction *saveAs;
QAction *printText;
QAction *exit;
QAction *undoAction;//撤销
QAction *redoAction;//恢复
QAction *copy;
QAction *cut;
QAction *paste;
QAction *insertImg;
QAction *insertTable;
QAction *find;
QAction *about;
QAction *aboutQt;
QAction *bold;
QAction *italic;
QAction *underLine;
QAction *color;
QAction *left;
QAction *center;
QAction *right;
QAction *justify;
QActionGroup *group;
QLabel *fontLabel;
QLabel *fontSizeLabel;
QFontComboBox *fontCom;
QComboBox *fontSizeCom;
QString fileName;
QLineEdit *lineEdit;
QLabel *label;
QPushButton *btn;
QVBoxLayout *layout;
QLineEdit *column;
QLineEdit *row;
private slots:
void findNext();
void NewFile();
void OpenFile();
void Save();
void SaveAs();
void Color();
void Bold();
void Italic();
void UnderLine();
void ALignment(QAction *);
void PrintText();
void InsertImage();
void InsertTable();
void mergeFormat(QTextCharFormat);
void FontComBox(QString fontComStr);
void FontSizeCom(QString fontSizeStr);
void Find();
void About();
void AboutQt();
void showCurrentCharFormatChanged(const QTextCharFormat &form);
};
#endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
setWindowIcon(QIcon(":/images/textEditor.png"));
setWindowTitle(tr("Qt文本编辑器"));
textEdit = new QTextEdit();
setCentralWidget(textEdit);
createAction();//创建动作
createMenu();//创建菜单
createToolBar();//创建工具栏
//文件菜单的动作与槽的连接
connect(newFile,SIGNAL(triggered()),this,SLOT(NewFile()));
connect(openFile,SIGNAL(triggered()),this,SLOT(OpenFile()));
connect(save,SIGNAL(triggered()),this,SLOT(Save()));
connect(saveAs,SIGNAL(triggered()),this,SLOT(SaveAs()));
connect(exit,SIGNAL(triggered()),this,SLOT(close()));
//编辑菜单的动作与槽的连接
connect(cut,SIGNAL(triggered()),textEdit,SLOT(cut()));
connect(copy,SIGNAL(triggered()),textEdit,SLOT(copy()));
connect(paste,SIGNAL(triggered()),textEdit,SLOT(paste()));
connect(undoAction,SIGNAL(triggered()),textEdit,SLOT(undo()));
connect(redoAction,SIGNAL(triggered()),textEdit,SLOT(redo()));
//字体设置动作与槽的连接
connect(fontCom,SIGNAL(activated(QString)),this,
SLOT(FontComBox(QString)));
//字号设置动作与槽的连接
connect(fontSizeCom,SIGNAL(activated(QString)),this,SLOT(FontSizeCom(QString)));
connect(textEdit,SIGNAL(currentCharFormatChanged(QTextCharFormat&)),
this,SLOT(showCurrentCharFormatChanged(QTextCharFormat&)));
//颜色编辑动作与槽的连接
connect(color,SIGNAL(triggered()),this,SLOT(Color()));
//格式菜单动作与槽的连接
connect(bold,SIGNAL(triggered()),this,SLOT(Bold()));
connect(italic,SIGNAL(triggered()),this,SLOT(Italic()));
connect(underLine,SIGNAL(triggered()),this,SLOT(UnderLine()));
connect(group,SIGNAL(triggered(QAction*)),this,SLOT(ALignment(QAction *)));
//插入菜单动作与槽的连接
connect(insertImg,SIGNAL(triggered()),this,SLOT(InsertImage()));
connect(insertTable,SIGNAL(triggered()),this,SLOT(InsertTable()));
//打印动作与槽的连接
connect(printText,SIGNAL(triggered()),this,SLOT(PrintText()));
//查找菜单动作与槽的连接
connect(find,SIGNAL(triggered()),this,SLOT(Find()));
connect(about,SIGNAL(triggered()),this,SLOT(About()));
connect(aboutQt,SIGNAL(triggered()),this,SLOT(AboutQt()));
resize(1000,600);
}
//创建动作
void MainWindow::createAction(){
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
//新建文件
newFile = new QAction(QIcon(":/images/new.png"),tr("新建文件"),this);
newFile->setShortcut(tr("Ctrl N"));
newFile->setStatusTip(tr("新建一个文件"));
//打开文件
openFile = new QAction(QIcon(":/images/open.png"),tr("打开文件"),this);
openFile->setShortcut(tr("Ctrl O"));
openFile->setStatusTip(tr("打开一个文件"));
//保存文件
save = new QAction(QIcon(":/images/save.png"),tr("保存"),this);
save->setShortcut(tr("Ctrl S"));
save->setStatusTip(tr("保存文件"));
//另存为
saveAs = new QAction(QIcon(":/images/saveAs.png"),tr("另存为"),this);
saveAs->setShortcut(tr("Ctrl A"));
saveAs->setStatusTip(tr("文件另存为"));
//打印
printText = new QAction(QIcon(":/images/printText.png"),tr("打印"),this);
printText->setShortcut(tr("Ctrl P"));
printText->setStatusTip(tr("打印"));
//退出
exit = new QAction(QIcon(":/images/exit.png"),tr("退出"),this);
exit->setShortcut(tr("Ctrl E"));
exit->setStatusTip(tr("退出"));
//恢复
redoAction = new QAction(QIcon(":/images/redo.png"),tr("恢复"),this);
redoAction->setShortcut(tr("Ctrl R"));
redoAction->setStatusTip(tr("恢复"));
//撤销
undoAction = new QAction(QIcon(":/images/undo.png"),tr("撤销"),this);
undoAction->setShortcut(tr("Ctrl U"));
undoAction->setStatusTip(tr("撤销"));
//剪切
cut = new QAction(QIcon(":/images/cut.png"),tr("剪切"),this);
cut->setShortcut(tr("Ctrl X"));
cut->setStatusTip(tr("剪切"));
//复制
copy = new QAction(QIcon(":/images/copy.png"),tr("复制"),this);
copy->setShortcut(tr("Ctrl C"));
copy->setStatusTip(tr("复制"));
//粘贴
paste = new QAction(QIcon(":/images/paste.png"),tr("黏贴"),this);
paste->setShortcut(tr("Ctrl P"));
paste->setStatusTip(tr("粘贴"));
//粗体
bold = new QAction(QIcon(":/images/bold.png"),tr("粗体"),this);
bold->setStatusTip(tr("粗体字"));
bold->setCheckable(true);
//斜体
italic = new QAction(QIcon(":/images/italic.png"),tr("斜体"),this);
italic->setStatusTip(tr("斜体字"));
italic->setCheckable(true);
//下划线
underLine = new QAction(QIcon(":/images/underline.png"),tr("下划线"),this);
underLine->setStatusTip(tr("下划线"));
underLine->setCheckable(true);
//颜色
color = new QAction(QIcon(":/images/color.png"),tr("颜色"),this);
color->setShortcut(tr("Ctrl C"));
color->setStatusTip(tr("颜色编辑"));
group = new QActionGroup(this);
//左对齐
left = new QAction(QIcon(":/images/left.png"),tr("左对齐"),group);
left->setStatusTip(tr("左对齐"));
left->setCheckable(true);
//居中
center = new QAction(QIcon(":/images/center.png"),tr("居中对齐"),group);
center->setStatusTip(tr("居中对齐"));
center->setCheckable(true);
//右对齐
right = new QAction(QIcon(":/images/right.png"),tr("右对齐"),group);
right->setStatusTip(tr("右对齐"));
right->setCheckable(true);
//两端对齐
justify = new QAction(QIcon(":/images/justify.png"),tr("两端对齐"),group);
justify->setStatusTip(tr("两端对齐"));
justify->setCheckable(true);
group->addAction(left);
group->addAction(center);
group->addAction(right);
group->addAction(justify);
//插入图片
insertImg = new QAction(QIcon(":/images/image.png"),tr("插入图片"),this);
insertImg->setStatusTip(tr("插入图片"));
//插入表格
insertTable = new QAction(QIcon(":/images/table.png"),tr("插入表格"),this);
insertTable->setStatusTip(tr("插入表格"));
//查找
find = new QAction(QIcon(":/images/find.png"),tr("查找"),this);
find->setShortcut(tr("Ctrl F"));
find->setStatusTip(tr("查找"));
//关于
about = new QAction(QIcon(":/images/about.png"),tr("关于"),this);
about->setStatusTip(tr("关于"));
//字体
fontLabel = new QLabel(tr("字体"));
fontCom = new QFontComboBox();
fontCom->setFontFilters(QFontComboBox::ScalableFonts);
fontCom->setStatusTip(tr("字体设置"));
//字号
fontSizeLabel = new QLabel(tr("字号"));
QFontDatabase db;
fontSizeCom = new QComboBox();
foreach(int size,db.standardSizes())
fontSizeCom->addItem(QString::number(size));
fontSizeCom->setStatusTip(tr("字号设置"));
//关于
aboutQt = new QAction(tr("关于QT"),this);
aboutQt->setStatusTip(tr("关于Qt"));
}
//创建菜单
void MainWindow::createMenu(){
//文件菜单
file = menuBar()->addMenu(tr("文件(&F)"));
file->addAction(newFile);
file->addAction(openFile);
file->addSeparator();
file->addAction(save);
file->addAction(saveAs);
file->addSeparator();
file->addAction(printText);
file->addSeparator();
file->addAction(exit);
//编辑菜单
edit = menuBar()->addMenu(tr("编辑(&E)"));
edit->addAction(undoAction);
edit->addAction(redoAction);
edit->addSeparator();
edit->addAction(cut);
edit->addAction(copy);
edit->addAction(paste);
//插入菜单
insert = menuBar()->addMenu(tr("插入(&I)"));
insert->addAction(insertImg);
insert->addAction(insertTable);
//查找菜单
search = menuBar()->addMenu(tr("查找(&F)"));
search->addAction(find);
//格式菜单
style = menuBar()->addMenu(tr("格式(&S)"));
style->addAction(bold);
style->addAction(italic);
style->addAction(underLine);
style->addSeparator();
style->addAction(color);
style->addSeparator();
style->addAction(left);
style->addAction(center);
style->addAction(right);
style->addAction(justify);
//帮助菜单
help = menuBar()->addMenu(tr("帮助(&H)"));
help->addAction(about);
help->addAction(aboutQt);
}
//创建工具栏
void MainWindow::createToolBar(){
//文件
fileToolBar = addToolBar(tr("文件(&N)"));
fileToolBar->addAction(newFile);
fileToolBar->addAction(openFile);
fileToolBar->addSeparator();
fileToolBar->addAction(save);
fileToolBar->addAction(saveAs);
fileToolBar->addSeparator();
fileToolBar->addAction(printText);
fileToolBar->addSeparator();
//编辑
editToolBar = addToolBar(tr("编辑(&E)"));
editToolBar->addAction(undoAction);
editToolBar->addAction(redoAction);
editToolBar->addSeparator();
editToolBar->addAction(cut);
editToolBar->addAction(copy);
editToolBar->addAction(paste);
//格式
styleToolBar = addToolBar(tr("格式(&S)"));
styleToolBar->addAction(bold);
styleToolBar->addAction(italic);
styleToolBar->addAction(underLine);
styleToolBar->addSeparator();
styleToolBar->addAction(left);
styleToolBar->addAction(center);
styleToolBar->addAction(right);
styleToolBar->addAction(justify);
styleToolBar->addSeparator();
styleToolBar->addWidget(fontLabel);
styleToolBar->addWidget(fontCom);
styleToolBar->addWidget(fontSizeLabel);
styleToolBar->addWidget(fontSizeCom);
//插入
insertToolBar = addToolBar(tr("插入(&I)"));
insertToolBar->addAction(insertImg);
insertToolBar->addAction(insertTable);
insertToolBar->addSeparator();
//查找
searchToolBar = addToolBar(tr("查找(&F)"));
searchToolBar->addAction(find);
search->addSeparator();
}
//封装的读文件,用于精简程序
void MainWindow::fileRead(){
QFile file(fileName);
if(!file.open(QFile::ReadOnly|QFile::Text)){
QMessageBox::warning(this,tr("多文档编辑器"),
tr("不可以打开文件%1:n%2").arg(fileName).arg(file.errorString()));
return;
}
QTextStream in(&file);
QApplication::setOverrideCursor(Qt::WaitCursor);
textEdit->setPlainText(in.readAll());
QApplication::restoreOverrideCursor();
}
//封装的写文件,用于精简程序
void MainWindow::fileWrite(){
QFile file(fileName);
if(!file.open(QFile::WriteOnly|QFile::Text)){
QMessageBox::warning(this,tr("多文档编辑器"),
tr("不可以写入文件%1:/n%2").arg(fileName).arg(file.errorString()));
return;
}
QTextStream out(&file);
QApplication::setOverrideCursor(Qt::WaitCursor);
out<<textEdit->toPlainText();
QApplication::restoreOverrideCursor();
return;
}
//新建文件
void MainWindow::NewFile(){
MainWindow *newEdit = new MainWindow;
newEdit->show();
}
//打开文件
void MainWindow::OpenFile(){
fileName = QFileDialog::getOpenFileName(this,tr("打开文件"),"/","allFile(*.*)");
if(!fileName.isEmpty()){
if(textEdit->document()->isEmpty()){
fileRead();
}else{
MainWindow *newEdit = new MainWindow;
newEdit->show();
QFile file(fileName);
if(!file.open(QFile::ReadOnly|QFile::Text)){
QMessageBox::warning(this,tr("多文档编辑器"),
tr("不可以打开文件%1:n%2").arg(fileName).arg(file.errorString()));
return;
}
QTextStream in(&file);
QApplication::setOverrideCursor(Qt::WaitCursor);
newEdit->textEdit->setPlainText(in.readAll());
QApplication::restoreOverrideCursor();
}
}
}
//保存文件
void MainWindow::Save(){
if(fileName.isEmpty()){
fileName = QFileDialog::getSaveFileName(this,tr("另存为"),tr("未命名.txt"));
fileWrite();
}else{
fileWrite();
}
}
//另存为
void MainWindow::SaveAs(){
fileName = QFileDialog::getSaveFileName(this,tr("另存为"),tr("未命名.txt"));
fileWrite();
}
//字体设置
void MainWindow::FontComBox(QString fontComStr){
QTextCharFormat format;
format.setFontFamily(fontComStr);
mergeFormat(format);
}
void MainWindow::mergeFormat(QTextCharFormat format){
QTextCursor cursor = textEdit->textCursor();
if(!cursor.hasSelection())
cursor.select(QTextCursor::WordUnderCursor);
cursor.mergeCharFormat(format);
textEdit->mergeCurrentCharFormat(format);
}
//字号设置
void MainWindow::FontSizeCom(QString fontSizeStr){
QTextCharFormat format;
format.setFontPointSize(fontSizeStr.toFloat());
textEdit->mergeCurrentCharFormat(format);
}
//颜色设置
void MainWindow::Color(){
QColor color = QColorDialog::getColor(Qt::blue,this);
if(color.isValid()){
QTextCharFormat format;
format.setForeground(color);
textEdit->mergeCurrentCharFormat(format);
}
}
//粗体
void MainWindow::Bold(){
QTextCharFormat format;
format.setFontWeight(bold->isChecked()?QFont::Bold:QFont::Normal);
textEdit->mergeCurrentCharFormat(format);
}
//斜体
void MainWindow::Italic(){
QTextCharFormat format;
format.setFontItalic(italic->isChecked());
textEdit->mergeCurrentCharFormat(format);
}
//下划线
void MainWindow::UnderLine(){
QTextCharFormat format;
format.setFontUnderline(underLine->isChecked());
textEdit->mergeCurrentCharFormat(format);
}
//对齐
void MainWindow::ALignment(QAction *act){
if(act == left){
textEdit->setAlignment(Qt::AlignLeft);
}else if(act == center){
textEdit->setAlignment(Qt::AlignCenter);
}else if(act == right){
textEdit->setAlignment(Qt::AlignRight);
}else if(act == justify){
textEdit->setAlignment(Qt::AlignJustify);
}
}
//插入图片
void MainWindow::InsertImage(){
QTextCursor cursor = textEdit->textCursor();
QTextImageFormat format;
QString image = QFileDialog::getOpenFileName(this,"insert image","/","png(*.png)");
format.setName(image);
cursor.insertImage(format);
}
//插入表格,用到输入对话框
void MainWindow::InsertTable(){
bool ok;
int a = QInputDialog::getInt(this,tr("插入表格"),tr("输入行数:"),0,0,300,1,&ok);
int b = QInputDialog::getInt(this,tr("插入表格"),tr("输入列数:"),0,0,300,1,&ok);
if(ok){
QTextCursor cursor = textEdit->textCursor();
QTextTableFormat format;
format.setCellSpacing(0);
format.setCellPadding(30);
cursor.insertTable(a,b,format);
}
}
//查找
void MainWindow::Find(){
QDialog *dialog = new QDialog(this);
dialog->setWindowTitle(tr("查找"));
lineEdit = new QLineEdit(dialog);
label = new QLabel(this);
btn = new QPushButton(dialog);
btn->setText(tr("下一个"));
connect(btn,SIGNAL(clicked()),this,SLOT(findNext()));
layout = new QVBoxLayout();
layout->addWidget(lineEdit);
layout->addWidget(btn);
dialog->setLayout(layout);
dialog->resize(60,60);
dialog->show();
}
void MainWindow::findNext(){
QString str = lineEdit->text();
bool isfind = textEdit->find(str,QTextDocument::FindBackward);
if(isfind){
label->setText(tr("查找目标在,行号:%1 列号:%2!").arg(textEdit->textCursor().blockNumber()).arg(textEdit->textCursor().columnNumber()));
ui->statusBar->addPermanentWidget(label);
}
}
//打印
void MainWindow::PrintText(){
QPrinter printer;
QPrintDialog printDialog(&printer,this);
if(printDialog.exec()){
QTextDocument *textDocument = textEdit->document();
textDocument->print(&printer);
}
}
//帮助
void MainWindow::About(){
QMessageBox::about(this,tr("关于"),tr("这是一个文本编辑器"));
}
void MainWindow::AboutQt(){
QMessageBox::aboutQt(this,tr("Qt编辑器"));
}
void MainWindow::showCurrentCharFormatChanged(const QTextCharFormat &form){
fontCom->setCurrentIndex(fontCom->findText(form.fontFamily()));
fontSizeCom->setCurrentIndex(fontSizeCom->findText(QString::number(form.fontPointSize())));
bold->setChecked(form.font().bold());
italic->setChecked(form.font().italic());
underLine->setChecked(form.font().underline());
}
MainWindow::~MainWindow()
{
delete ui;
}
main.cpp:
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}