QTextEdit实现富文本记事本

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


/*---------------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--------------------*/

你可能感兴趣的:(Qt-GUI编程)