QTextEdit实现富文本记事本

来源:互联网 发布:淘宝宝贝怎么上架 编辑:程序博客网 时间:2024/05/22 15:22

用Qt实现一个多功能记事本,
功能 :布局对齐,字体变换,颜色改变.
格式 :自动保存为rtf格式,支持txt格式,兼容MS Word打开.
涉及知识 :文件保存过滤器的使用,文件的输入输出流,光标的控制
可能会有一些小Bug
效果图如下:
这里写图片描述


/*---------------MyNotepad.h--------------------*/#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QAction>#include <QMenu>#include <QTextEdit>#include <QMenuBar>#include <QCloseEvent>#include <QLabel>class MainWindow : public QMainWindow{    Q_OBJECTpublic:    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 <QTextCursor>#include <QFileDialog>#include <QFile>#include <QString>#include <QTextStream>#include <QMessageBox>#include <QHBoxLayout>#include <QMessageBox>#include <QColor>#include <QColorDialog>#include <QFont>#include <QFontDialog>#include <QDateTime>#include <QMovie>#include <QDesktopServices>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<<textEdit->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<<textEdit->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 <QApplication>#include <QTextCodec>#include <QMessageBox>int main(int argc, char *argv[]){    QApplication a(argc, argv);    MainWindow w;    w.show();    return a.exec();}/*---------------main.cpp--------------------*/
0 0
原创粉丝点击