qt编程兑现的简易记事本(范例)

qt编程实现的简易记事本(范例)
     Qt是一种跨平台的原生开发框架,面向所有主要的操作系统,包括Linux、Windows、Mac、Symbian和Maemo。本文介绍的是在Windows下用qt编程实现的简易记事本,有兴趣学习qt编程的可以看看。本人也是刚接触qt编程,觉得qt相对其他语言来说学起来还是比较容易的。
  这是我用Qt Creator实现的简易记事本:
qt编程兑现的简易记事本(范例)
上面界面是用Qt  Designer实现的,不懂的朋友们看下面:
1.创建主界面Main Window
qt编程兑现的简易记事本(范例)
2.在toolbar创建菜单栏,如:"文件",在里在创建子菜单"新建"(如Windows下的记事本就是这样)
qt编程兑现的简易记事本(范例)
3.添加图片
Qt  Designer界面右边子菜单"新建"下windowIcon栏里点击"…":
qt编程兑现的简易记事本(范例)
qt编程兑现的简易记事本(范例)
 
 4.点击上面图标:选择要添加图片的路径(当前路径下)
子菜单"新建"选择匹配的图片,点击ok就出现:
qt编程兑现的简易记事本(范例)
是不是在actionNew(新建)前面有出现小图标,在往工具栏里移动,就出现上述效果了。
 
        这只是实现了一部分功能,大家可以看一下
mainwindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileDialog>
#include <QTextStream>
#include <QMessageBox>
#include <QDialog>
#include <QLineEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void changeTitle(const QString &filename);
    void openfile(const QString &filename);
    void savefile(const QString &filename);


private:
    Ui::MainWindow *ui;
    QString curFile;
    QLineEdit *find_textLineEdit;

private slots:
    void show_findText();
    void on_action_2_triggered();//查找
    void on_plan_textEdit_copyAvailable(bool b);
    void on_plan_textEdit_textChanged();
    void on_action_U_triggered();//撤销
    void on_action_P_triggered();//粘贴
    void on_action_C_triggered();//复制
    void on_action_T_triggered();//剪切
    void on_actionExit_triggered();//退出
    bool on_actionSave_triggered();//保存
    bool on_actionSave_As_triggered();//另存为
    void on_actionOpen_triggered();//打开
    void on_actionNew_triggered();//新建
};

#endif // MAINWINDOW_H

main.h文件
#include <QtGui/QApplication>
#include <QTextCodec>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));


    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->changeTitle("");
    this->setCentralWidget(ui->plan_textEdit);
    //设置action的属性
    ui->action_T->setEnabled(false);
    ui->action_C->setEnabled(false);
    //设置界面图标
  this->setWindowIcon(QIcon(":/images/editor.png"));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::savefile(const QString &filename)
{
    QFile file(filename);
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){
        QMessageBox::warning(this, "Save",
                             tr("Save , error ?")
                             .arg(filename)
                            .arg(file.errorString()));
        return ;
    }
    QTextStream out(&file);
    out << ui->plan_textEdit->toPlainText();
    file.close();
}

void MainWindow::openfile(const QString &filename)
{
    QFile file(filename);
    if(file.open(QIODevice::ReadOnly | QIODevice::Text)){
        QMessageBox::warning(this, "Open",
                             tr("Save , error ?")
                             .arg(filename)
                             .arg(file.errorString()));
        return ;
    }
    QTextStream in(&file);
    QString s=in.readAll();
    ui->plan_textEdit->setPlainText(s);
}
void MainWindow::changeTitle(const QString &filename)
{
    qDebug()<<"***"<<filename;
    if(filename.isEmpty()){
         this->curFile = "";
         this->setWindowTitle(tr("无标题.txt[*]--记事本"));
    }
    else{
        this->curFile = filename;
        QFileInfo fi(filename);
        QString name=fi.fileName();
        this->setWindowTitle(tr("%1[*]--记事本").arg(name));
        qDebug()<<"===="<<name;
    }
    this->setWindowModified(false);
    ui->plan_textEdit->document()->setModified(false);
}

void MainWindow::on_actionNew_triggered()//新建
{
    QTextDocument *document=ui->plan_textEdit->document();
    if(!document->isModified()){
        ui->plan_textEdit->setPlainText("");
        this->changeTitle("");
        return ;
    }
    int ret=QMessageBox::question(this, "Save?",
                                  "disSave, Save",
                                  QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
    switch(ret)
    {
    case QMessageBox::Cancel:

        break;
    case QMessageBox::Discard:
        ui->plan_textEdit->setPlainText("");
        this->changeTitle("");
        break;
    case QMessageBox::Save:
          if(!on_actionSave_triggered())
                 return ;
          ui->plan_textEdit->setPlainText("");
          this->changeTitle("");
          break;
         }

}

void MainWindow::on_actionOpen_triggered()//打开
{
    QTextDocument *document=ui->plan_textEdit->document();
    if(document->isModified()){
        int ret=QMessageBox::question(this, "Save?",
                                      "disSave, Save",
                                      QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
        if(ret==QMessageBox::Cancel){
            return ;
        }
        else if(ret==QMessageBox::Save){

        }
    }
    //没修改    正常保存    放弃保存
    QString filename=QFileDialog::getOpenFileName(this);
    if(filename.isEmpty())
        return ;
    this->openfile(filename);
    this->changeTitle(filename);
}

bool MainWindow::on_actionSave_As_triggered()//另存为
{
    QString fileName=QFileDialog::getSaveFileName(this,tr("Save File"));
    if(fileName.isEmpty())
        return false;
    this->savefile(fileName);
    this->changeTitle(fileName);
    return true;
}


bool MainWindow::on_actionSave_triggered()//保存
{
    if(this->curFile.isEmpty())
     // qDebug()<<"+++";
            return on_actionSave_As_triggered();

    else
    {
        savefile(this->curFile);
      this->setWindowModified(false);
    }
    return true;
}

void MainWindow::on_actionExit_triggered()//退出
{
    this->close();
}

void MainWindow::on_action_T_triggered()//剪切
{
    this->ui->plan_textEdit->cut();
}

void MainWindow::on_action_C_triggered()//复制
{
    this->ui->plan_textEdit->copy();
}

void MainWindow::on_action_P_triggered()//粘贴
{
    this->ui->plan_textEdit->paste();
}


void MainWindow::on_action_U_triggered()//撤销
{
   this->ui->plan_textEdit->undo();
}

void MainWindow::on_plan_textEdit_textChanged()
{
    //qDebug()<<"niaho";
    this->setWindowModified(true);
}

void MainWindow::on_plan_textEdit_copyAvailable(bool b)
{
    ui->action_T->setEnabled(b);
    ui->action_C->setEnabled(b);

}
//这部分是编码实现的,可以看看与界面设计实现的有什么不一样
void MainWindow::on_action_2_triggered()//查找
{
   QDialog *findDlg=new QDialog(this);
   findDlg->setWindowTitle(tr("Find!"));
   find_textLineEdit=new QLineEdit(findDlg);
   QPushButton *find_Bth=new QPushButton(tr("查找下一个"),findDlg);

   QHBoxLayout *layout=new QHBoxLayout(findDlg);
   layout->addWidget(find_textLineEdit);
   layout->addWidget(find_Bth);

   findDlg->show();

   connect(find_Bth,SIGNAL(clicked()),this,SLOT(show_findText()));
}
void MainWindow::show_findText()
{
    QString findText=find_textLineEdit->text();
    if(!ui->plan_textEdit->find(findText,QTextDocument::FindBackward))
    {
        QMessageBox::warning(this,tr("查找"),tr("找不到 %1").arg(findText));
    }
}

其实还有一部分功能没实现,有兴趣的话可以关注我下一篇文章。