Qt文本編輯器

對着資料敲出來的,要自己實現肯定要花很久很久,最大的感受是不一定所有函數都弄成槽函數,可以定義普通函數,然後槽函數調用普通函數。
mainwindow
菜單欄
工具欄
內容
狀態欄

main.cpp

#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QTextCodec>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
    //實現中文顯示
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTextCodec>
#include <QLineEdit>
#include <QLabel>
namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    bool isSaved; //爲 true 時標誌文件已經保存,爲 false 時標誌文件尚未保存
    QString curFile; //保存當前文件的文件名
    QLineEdit *find_textLineEdit; //聲明一個行編輯器,用於輸入要查找的內容

    void do_file_New(); //新建文件
    void do_file_SaveOrNot(); //修改過的文件是否保存
    void do_file_Save(); //保存文件
    void do_file_SaveAs(); //文件另存爲
    bool saveFile(const QString& fileName); //存儲文件

    void do_file_Open(); //打開文件
    bool do_file_Load(const QString& fileName); //讀取文件

    QLabel* first_statusLabel; //聲明兩個標籤對象,用於顯示狀態信息
    QLabel* second_statusLabel;
    void init_statusBar(); //初始化狀態欄

private slots:
    void on_action_C_2_triggered();
    void on_action_F_triggered();
    void on_action_V_triggered();
    void on_action_X_2_triggered();
    void on_action_Z_triggered();
    void on_action_X_triggered();
    void on_action_C_triggered();
    void on_action_O_triggered();
    void on_action_A_triggered();
    void on_action_S_triggered();
    void on_action_N_triggered();
    void show_findText();
    void do_cursorChanged();//獲取光標位置信息
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include  <QtGui>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    init_statusBar();
    connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(do_cursorChanged()));//一旦光標改變就觸發其槽函數

    isSaved = false; //初始化文件爲未保存過狀態
    curFile = tr("未命名.txt"); //初始化文件名爲"未命名.txt"
    setWindowTitle(curFile); //初始化主窗口的標題
}

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

void MainWindow::do_file_New() //實現新建文件的功能
{
    do_file_SaveOrNot();
    isSaved = false;
    curFile = tr("未命名.txt");//給QString賦值方式
    setWindowTitle(curFile);
    ui->textEdit->clear(); //清空文本編輯器
    ui->textEdit->setVisible(true); //文本編輯器可見
}
//新建文件,先要判斷正在編輯的文件是否需要保存。然後將新建的文件標誌爲未保存過狀態。

void MainWindow::do_file_SaveOrNot() //彈出是否保存文件對話框
{
    if(ui->textEdit->document()->isModified()) //如果文件被更改過,彈出保存對話框
    {
        QMessageBox box;
        box.setWindowTitle(tr("警告"));
        box.setIcon(QMessageBox::Warning);
        box.setText(curFile + tr("尚未保存,是否保存?"));
        box.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
        if(box.exec() == QMessageBox::Yes) //如果選擇保存文件,則執行保存操作
        do_file_Save();
    }
}

void MainWindow::do_file_Save() //保存文件
{
    if(isSaved)
    { //如果文件已經被保存過,直接保存文件
        saveFile(curFile);
    }
    else
    {
        do_file_SaveAs(); //如果文件是第一次保存,那麼調用另存爲
    }
}

void MainWindow::do_file_SaveAs() //文件另存爲
{
    QString fileName = QFileDialog::getSaveFileName(this,tr("另存爲"),curFile);
//獲得文件名
    if(!fileName.isEmpty()) //如果文件名不爲空,則保存文件內容
    {
        saveFile(fileName);
    }
}

bool MainWindow::saveFile(const QString& fileName)
//保存文件內容,因爲可能保存失敗,所以具有返回值,來表明是否保存成功
{
    QFile file(fileName);
    if(!file.open(QFile::WriteOnly | QFile::Text))
//以只寫方式打開文件,如果打開失敗則彈出提示框並返回
    {
    QMessageBox::warning(this,tr("保存文件"),tr("無法保存文件 %1:\n %2").arg(fileName).arg(file.errorString()));
    return false;
    }
//%1,%2 表示後面的兩個 arg 參數的值
    QTextStream out(&file); //新建流對象,指向選定的文件
    out << ui->textEdit->toPlainText(); //將文本編輯器裏的內容以純文本的形式輸出到流對象中
    isSaved = true;
    curFile = QFileInfo(fileName).canonicalFilePath(); //獲得文件的標準路徑
    setWindowTitle(curFile); //將窗口名稱改爲現在窗口的路徑
    second_statusLabel->setText(tr("保存文件成功"));
    return true;
}

void MainWindow::do_file_Open()//打開文件
{
    do_file_SaveOrNot();//是否需要保存現有文件
    QString fileName = QFileDialog::getOpenFileName(this);
    //獲得要打開的文件的名字
    if(!fileName.isEmpty())//如果文件名不爲空
    {
        do_file_Load(fileName);
    }
    ui->textEdit->setVisible(true);//文本編輯器可見
}

bool MainWindow::do_file_Load(const QString& fileName) //讀取文件
{
    QFile file(fileName);
    if(!file.open(QFile::ReadOnly | QFile::Text))
    {
        QMessageBox::warning(this,tr("讀取文件"),tr("無法讀取文件 %1:\n%2.").arg(fileName).arg(file.errorString()));
        return false; //如果打開文件失敗,彈出對話框,並返回
    }
    QTextStream in(&file);
    ui->textEdit->setText(in.readAll()); //將文件中的所有內容都寫到文本編輯器中
    curFile = QFileInfo(fileName).canonicalFilePath();
    setWindowTitle(curFile);
    second_statusLabel->setText(tr("打開文件成功"));
    return true;
}


void MainWindow::on_action_N_triggered()
{
    do_file_New();
}

void MainWindow::on_action_S_triggered()
{
    do_file_Save();
}

void MainWindow::on_action_A_triggered()
{
    do_file_SaveAs();
}

void MainWindow::on_action_O_triggered()
{
    do_file_Open();
}

void MainWindow::on_action_C_triggered()
{
    do_file_SaveOrNot();
    ui->textEdit->setVisible(false);
    first_statusLabel->setText(tr("文本編輯器已關閉"));
    second_statusLabel->setText(tr("cmz製作!"));
}

void MainWindow::on_action_X_triggered()
{
    on_action_C_triggered(); //先執行關閉操作
    qApp->quit(); //再退出系統,qApp 是指向應用程序的全局指針
}

void MainWindow::on_action_Z_triggered()
{
    ui->textEdit->undo();
}

void MainWindow::on_action_X_2_triggered()
{
    ui->textEdit->cut();
}

void MainWindow::on_action_V_triggered()
{
    ui->textEdit->paste();
}

void MainWindow::on_action_C_2_triggered()
{
    ui->textEdit->copy();
}

void MainWindow::on_action_F_triggered()
{
    QDialog *findDlg = new QDialog(this);
    //新建一個對話框,用於查找操作,this 表明它的父窗口是 MainWindow。
    findDlg->setWindowTitle(tr("查找"));
    //設置對話框的標題
    find_textLineEdit = new QLineEdit(findDlg);
    //將行編輯器加入到新建的查找對話框中
    QPushButton *find_Btn = new QPushButton(tr("查找下一個"),findDlg);
    //加入一個“查找下一個”的按鈕
    QVBoxLayout* layout = new QVBoxLayout(findDlg);
    layout->addWidget(find_textLineEdit);
    layout->addWidget(find_Btn);
    //新建一個垂直佈局管理器,並將行編輯器和按鈕加入其中
    findDlg ->show();
    //顯示對話框
    connect(find_Btn,SIGNAL(clicked()),this,SLOT(show_findText()));
    //設置“查找下一個”按鈕的單擊事件和其槽函數的關聯
    second_statusLabel->setText(tr("正在進行查找"));
}
void MainWindow::show_findText()//“查找下一個”按鈕的槽函數
{
    QString findText = find_textLineEdit->text();
    //獲取行編輯器中的內容
    if(!ui->textEdit->find(findText,QTextDocument::FindBackward))
    {
        QMessageBox::warning(this,tr("查找"),tr("找不到 %1").arg(findText));
    }
}
void MainWindow::init_statusBar()
{
    QStatusBar* bar = ui->statusBar; //獲取狀態欄
    first_statusLabel = new QLabel; //新建標籤
    first_statusLabel->setMinimumSize(150,20); //設置標籤最小尺寸
    first_statusLabel->setFrameShape(QFrame::WinPanel); //設置標籤形狀
    first_statusLabel->setFrameShadow(QFrame::Sunken); //設置標籤陰影
    second_statusLabel = new QLabel;
    second_statusLabel->setMinimumSize(150,20);
    second_statusLabel->setFrameShape(QFrame::WinPanel);
    second_statusLabel->setFrameShadow(QFrame::Sunken);
    bar->addWidget(first_statusLabel);
    bar->addWidget(second_statusLabel);
    first_statusLabel->setText(tr("歡迎使用文本編輯器")); //初始化內容
    second_statusLabel->setText(tr("cmz製作!"));
}

void MainWindow::do_cursorChanged()
{
    int rowNum = ui->textEdit->document()->blockCount();
    //獲取光標所在行的行號
    const QTextCursor cursor = ui->textEdit->textCursor();
    int colNum = cursor.columnNumber();
    //獲取光標所在列的列號
    first_statusLabel->setText(tr("%1 行 %2 列").arg(rowNum).arg(colNum));//tr中的內容可爲變量
    //在狀態欄顯示光標位置
}


成果圖

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章