1. 程式人生 > >Qt 實現的文字編輯器

Qt 實現的文字編輯器

<span style="font-size:18px;"><span style="white-space: pre;">原始檔地址:</span><br style="white-space: pre;" /><span style="white-space: pre;">http://yunpan.cn/cjy8H3SW2jUEL  訪問密碼 0351</span></span><span style="font-size:14px;">
</span>
需要注意的幾點:

(1) setWindowIcon(

QIcon(":image\\text_coin.ico")); 設定視窗圖示的時候需要將圖片匯入資原始檔中,然後路徑 \ 用雙 \\ 或者 使用 / ,就可以設定了

(2) 獲取檔案的完整路徑 QFile file("filename");QString curFile = QFileInfo(file).canonicalFilePath();

(3)將文字檔案讀入 QTextEdit 控制元件中: QTextStream in(&file); ui->textEdit->setText(in.readAll());

(4)設定字型:bool ok;QFont uiFont = QFontDialog::getFont(&ok,ui->textEdit->font(),this,tr("字型設定"));

if(ok){ui->textEdit->setFont(uiFont);}

(5)設定顏色,顏色控制元件設定 PaletteQPalette uiBackPaltette = ui->textEdit->palette();//先獲得控制元件的 調色盤

QColoruiColor=QColorDialog::getColor(Qt::blue,this,tr("選擇背景顏色"));//設定開啟調色盤時的預設顏色是藍色

uiBackPalette.setColor(QPalette::Base,uiColor);

ui->textEdit->setPalette(uiBackPalette);

(6)將 QTextEdit 中的文字內容儲存:QTextStreamout(&file);//新建流物件,指向選定的檔案

out<<ui->textEdit->toPlainText();//將文字編輯器裡的內容以純文字的形式輸出到流物件中

下面是原始碼:

標頭檔案:

#ifndef NOTEPAD_H
#define NOTEPAD_H

#include <QMainWindow>
#include <QMessageBox>
#include <QFileDialog>
#include <QFile>
#include <QTextStream>
#include <QFileInfo>
#include <QLineEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QLabel>
#include <QStatusBar>
#include <QTextCursor>
#include <QIcon>
#include <QColorDialog>
#include <QPalette>
#include <QFont>
#include <QFontDialog>
#include <QList>
#include <QTextCharFormat>

namespace Ui {
class Notepad;
}

class Notepad : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::Notepad *ui;
    //true 時已經儲存 false 檔案還沒有儲存
    bool isSaved;
    //當前檔名字
    QString curFile;
    //用於輸入查詢的內容
    QLineEdit* findText;
    //兩個顯示狀態的標籤
    QLabel* firStatusLabel;
    QLabel* secStatusLabel;
public:
    void file_new();        //新建檔案
    void file_save();       //儲存檔案
    void file_saveAs();     //另存為
    void file_saveOrNot();  //修改過的檔案是否儲存
    void file_open();       //檔案開啟函式
    bool saveFile(const QString& filename);
    bool loadFile(const QString& fileName); //讀取檔案
    //初始化狀態列
    void init_statusBar();

private slots:
    //按鍵槽
    void on_action_N_triggered();
    void on_action_O_triggered();
    void on_action_S_triggered();
    void on_action_A_triggered();
    void on_action_X_triggered();
    void on_action_C_triggered();
    void on_action_6_triggered();
    void on_action_T_triggered();
    void on_action_C_2_triggered();
    void on_action_P_triggered();
    void on_action_I_triggered();

    //設定當前滑鼠所在行高亮槽
    void currentLineHighLight();
    //狀態列改變槽
    void cursorChanged();
    void find_Text();       //全域性查詢
    void find_Pre_Text();   //向前查詢

    //按鍵槽
    void on_action_F_triggered();
    void on_action_3_triggered();
    void on_action_U_triggered();
    void on_action_color_triggered();
    void on_action_font_triggered();
    void on_action_BackGround_triggered();
};

#endif // NOTEPAD_H

cpp檔案

#include "notepad.h"
#include "ui_notepad.h"

Notepad::Notepad(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Notepad)
{
    ui->setupUi(this);
    isSaved = false;
    curFile = tr("未命名.txt");
    setWindowTitle(curFile);
    setWindowIcon(QIcon(":image\\text_coin.ico"));
    //設定 tab移動的長度
    ui->textEdit->setTabStopWidth(20);

    init_statusBar();
    currentLineHighLight();
    //關聯滑鼠移動訊號槽
    connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(cursorChanged()));

    connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(currentLineHighLight()));
}

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

void Notepad::file_new()
{
    file_saveOrNot();               //先判斷正在編輯的檔案是否需要儲存
    isSaved = false;
    curFile = tr("未命名.txt");
    setWindowTitle(curFile);
    ui->textEdit->clear();              //清空文字編輯器
    ui->textEdit->setVisible(true);     //設定文字編輯器可見 試一下show
}

void Notepad::file_save()
{
    if(isSaved)                     //如果已經被儲存過,直接儲存檔案,否則就另存為
    {
        saveFile(curFile);
    }
    else
        file_saveAs();              //第一次儲存,呼叫另存為
}

void Notepad::file_saveAs()
{
    //獲得檔名
    QString fileName = QFileDialog::getSaveFileName(this,tr("另存為"),curFile+".txt","Text files (*.txt);; Dat files (*.dat);;HTML files (*.html)");
    //如果檔名不為空,則儲存檔案的內容
    if(!fileName.isEmpty())
    {
        saveFile(fileName);
    }
}

void Notepad::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)
        {
            file_save();
        }
    }
}

bool Notepad::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()));
        secStatusLabel->setText("檔案儲存失敗");
        return false;
    }
    QTextStream out(&file);             //新建流物件,指向選定的檔案
    out << ui->textEdit->toPlainText(); //將文字編輯器裡的內容以純文字的形式輸出到流物件中
    isSaved = true;
    curFile = QFileInfo(filename).canonicalFilePath();  //獲得檔案的標準路徑
    setWindowTitle(curFile);
    secStatusLabel->setText("檔案儲存成功");
    return true;
}

void Notepad::file_open()
{
    file_saveOrNot();           //先判斷現在的檔案是否需要儲存
    QString fileName = QFileDialog::getOpenFileName(this);
    if(!fileName.isEmpty())     //檔名不為空
    {
        loadFile(fileName);     //載入檔案
    }
    ui->textEdit->setVisible(true);
}

bool Notepad::loadFile(const QString &fileName)
{
    QFile file(fileName);
    if(!file.open(QFile::ReadOnly | QFile::Text))
    {
        QMessageBox::warning(this,"讀取檔案",tr("無法讀取檔案%1: \n %2").arg(fileName).arg(file.errorString()));
        secStatusLabel->setText("檔案開啟失敗");
        return false;
    }
    //檔案開啟成功
    QTextStream in(&file);
    ui->textEdit->setText(in.readAll());    //將檔案中的所有內容放到文字編輯器中
    curFile = QFileInfo(file).canonicalFilePath();
    setWindowTitle(curFile);
    secStatusLabel->setText("檔案開啟成功");
    return true;
}

//初始化狀態列
void Notepad::init_statusBar()
{
    QStatusBar* bar = ui->statusBar;
    firStatusLabel = new QLabel;
    firStatusLabel->setMinimumSize(150,20); //設定標籤最小尺寸
    firStatusLabel->setFrameShape(QFrame::WinPanel);    //設定標籤形狀
    firStatusLabel->setFrameShadow(QFrame::Sunken);     //設定標籤陰影

    secStatusLabel = new QLabel;
    secStatusLabel->setMinimumSize(150,20);
    secStatusLabel->setFrameShape(QFrame::WinPanel);
    secStatusLabel->setFrameShadow(QFrame::Sunken);

    bar->addWidget(firStatusLabel);
    bar->addWidget(secStatusLabel);
    firStatusLabel->setText("  歡迎使用文字編輯器");
    secStatusLabel->setText("              V1.0");
}

//當前行高亮
void Notepad::currentLineHighLight()
{
    QList<QTextEdit::ExtraSelection> extraSelection;
    QTextEdit::ExtraSelection selection;
    QColor lineColor = QColor(Qt::yellow).lighter(150);

    selection.format.setBackground(lineColor);
    selection.format.setProperty(QTextFormat::FullWidthSelection,true);
    selection.cursor = ui->textEdit->textCursor();
    selection.cursor.clearSelection();
    //將剛設定的 selection追加到連結串列當中
    extraSelection.append(selection);
    ui->textEdit->setExtraSelections(extraSelection);
}

//新建
void Notepad::on_action_N_triggered()
{
    file_new();
}

//開啟
void Notepad::on_action_O_triggered()
{
    file_open();
}

//儲存
void Notepad::on_action_S_triggered()
{
    file_save();
}

//另存為
void Notepad::on_action_A_triggered()
{
    file_saveAs();
}

//退出
void Notepad::on_action_X_triggered()
{
    on_action_C_triggered();
    qApp->quit();               //qApp是指向應用程式的全域性指
}

//關閉
void Notepad::on_action_C_triggered()
{
    file_saveOrNot();
    ui->textEdit->setVisible(false);
}

//剪下
void Notepad::on_action_T_triggered()
{
    ui->textEdit->cut();
}

//複製
void Notepad::on_action_C_2_triggered()
{
    ui->textEdit->copy();
}

//貼上
void Notepad::on_action_P_triggered()
{
    ui->textEdit->paste();
}

//清空
void Notepad::on_action_6_triggered()
{
    QMessageBox box;
    box.setWindowTitle("警告");
    box.setText("是否清空(不可恢復)?");
    box.setIcon(QMessageBox::Warning);
    box.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
    if(box.exec() == QMessageBox::Yes)
    {
        ui->textEdit->clear();
    }
}

//反撤銷
void Notepad::on_action_I_triggered()
{
    ui->textEdit->redo();
}

//游標移動函式
void Notepad::cursorChanged()
{
    QTextCursor cursor = ui->textEdit->textCursor();
    //獲取游標所在行號
    int row = cursor.blockNumber();
    //獲取游標所在列號
    int col = cursor.columnNumber();

    firStatusLabel->setText(tr("%1 行 %2 列").arg(row).arg(col));
}

//查詢函式
void Notepad::on_action_F_triggered()
{
    QDialog* findDlg = new QDialog(this);
    findDlg->setWindowTitle("查詢");
    findText = new QLineEdit(findDlg);      //將行編輯器的父視窗設定為剛才新建的對話方塊中
    QPushButton* findBtn = new QPushButton("向前查詢",findDlg);
    QPushButton* findAllBtn = new QPushButton("全域性查詢",findDlg);
    //新建一個垂直佈局管理器
    QVBoxLayout* layout = new QVBoxLayout(findDlg);
    layout->addWidget(findText);
    layout->addWidget(findBtn);
    layout->addWidget(findAllBtn);

    findDlg->show();
    connect(findBtn,SIGNAL(clicked()),this,SLOT(find_Text()));  //關聯槽函式
    connect(findAllBtn,SIGNAL(clicked()),this,SLOT(find_Pre_Text()));
}

//全域性查詢函式
void Notepad::find_Text()
{
    //獲取行編輯器中的內容
    QString text = findText->text();
    //向前查詢
    if(!ui->textEdit->find(text,QTextDocument::FindWholeWords))
    {
        QMessageBox::warning(this,"查詢",tr("找不到 %1").arg(text));
    }

}

//向前查詢函式
void Notepad::find_Pre_Text()
{
    //獲取行編輯器中的內容
    QString text = findText->text();
    if(!ui->textEdit->find(text,QTextDocument::FindBackward)) //沒有查到字元
    {
        QMessageBox::warning(this,"查詢",tr("找不到 %1").arg(text));
    }
}

void Notepad::on_action_3_triggered()
{
    QDialog* info = new QDialog(this);
    info->setWindowTitle("版本說明");
    info->resize(200,100);
    QLabel* text = new QLabel(info);
    text->move(80,50);
    text->setText("版本1.0");
    info->show();
}

//撤銷
void Notepad::on_action_U_triggered()
{
    ui->textEdit->undo();
}

//設定字型顏色
void Notepad::on_action_color_triggered()
{
    //獲取當前顏色
    QPalette uiPalette = ui->textEdit->palette();
    QColor uiColor = QColorDialog::getColor(Qt::blue,this,"設定字型顏色");
    if(uiColor.isValid())
    {
        uiPalette.setColor(QPalette::Text,uiColor);
        ui->textEdit->setPalette(uiPalette);
    }
}

//設定字型
void Notepad::on_action_font_triggered()
{
    bool ok;
    QFont uiFont = QFontDialog::getFont(&ok,ui->textEdit->font(),this,tr("字型設定"));
    if(ok)
    {
        ui->textEdit->setFont(uiFont);
    }
}

//設定背景顏色
void Notepad::on_action_BackGround_triggered()
{
    QPalette uiBackPalette = ui->textEdit->palette();
    QColor uiColor = QColorDialog::getColor(Qt::blue,this,tr("選擇背景顏色"));
    if(uiColor.isValid())
    {
        uiBackPalette.setColor(QPalette::Base,uiColor);
        ui->textEdit->setPalette(uiBackPalette);
    }
}

mian.cpp
#include "notepad.h"
#include <QApplication>
#include <QTextCodec>
#include <qtranslator.h>
#include <QProcess>
#include <QStringList>

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

    //設定顯示中文
    //QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());

    //顯示中文在 colorDialog 和 fontDialog 中
    QTranslator translator;

    QStringList environment = QProcess::systemEnvironment();
    QString str;
    bool bFinded = false;

    foreach(str, environment)
    {
        if(str.startsWith("QTDIR="))
        {
            bFinded = true;
            break;
        }
    }

    if(bFinded)
    {
        str = str.mid(6);
        bFinded = translator.load("qt_" + QLocale::system().name(),
                                  str.append("/translations/"));
        if(bFinded)
            qApp->installTranslator(&translator);
        else
        {
            QLabel lab(QObject::tr("沒有支援中文的Qt國際化翻譯檔案!"));
            lab.show();
        }
    }
    Notepad w;
    w.show();

    return a.exec();
}

相關推薦

Qt文字編輯實現語法高亮功能(Qscitinlla)

Qt中文字編輯器實現語法高亮功能(Qscitinlla) Scintilla是一個免費、跨平臺、支援語法高亮的編輯控制元件。它完整支援原始碼的編輯和除錯,包括語法高亮、錯誤指示、程式碼完成(code completion)和呼叫提示(call tips)。能包含標記(marker)的頁邊(mar

使用Qt開發文字編輯(二):標籤頁式文件實現

Qt中相關的類 標籤頁俗稱Tab頁,Qt提供了QTableWidget用於建立基於Tab頁式的文件。使用QTableWidget,我們可以很方便得新增和刪除Tab、設定和獲取Tab頁上面的文字,設定當前的Tab。 實現 MainWindow類中維護

Qt簡易文字編輯

程式碼及註釋如下: //mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QTextEdit> #include <QMainWindow> //class QTex

Qt 實現文字編輯

<span style="font-size:18px;"><span style="white-space: pre;">原始檔地址:</span><br style="white-space: pre;" /><sp

QT實現一個簡易文字編輯

setFixedSize(640,480);//設定視窗介面大小 //選單欄 newaction1=newQAction(QIcon("newfile.png"),"新建",this);//actio

summernote富文字編輯實現圖片新增上傳和刪除圖片

summernote的基本使用 HTML程式碼 //div添加個id就可以 <div id="summernote" ></div> 然後JS操作 //例項化呼叫 var $summernote = $('#summernote').summernote(

bbs專案富文字編輯實現上傳檔案到media目錄

media目錄是在project的settings中設定的,static目錄是django自己使用的靜態檔案的上傳目錄,media目錄是使用者自定義上傳檔案的目錄 # Django使用者上傳的檔案都放在media目錄下 MEDIA_URL = "/media/" MEDIA_ROOT = os.pat

vue2.0 實現文字編輯功能

前端富文字編譯器使用總結: UEditor:百度前端的開源專案,功能強大,基於 jQuery,但已經沒有再維護,而且限定了後端程式碼,修改起來比較費勁 bootstrap-wysiwyg:微型,易用,小而美,只是 Bootstrap + jQuery... kindEditor:功能強大,程

文字編輯 KindEditor 實現圖片上傳到騰訊雲物件儲存 COS

目錄   一、主要功能實現 二、效果圖 三、需要匯入的包 四、前端程式設計 五、後臺程式設計 六、github 下載 附加內容: 一、主要功能實現 1、配置 KindEditor  2、在 KindEditor 中實現圖片上傳

RichEditor——一款基於RecyclerView實現的富文字編輯實現方案(支援圖文、轉義生成MarkDown、粗體、斜體、下劃線、刪除線、超連結、標題等)

前言 對於富文字編輯器的實現,首先我們肯定會想到實現的編輯器需要支援的幾個必要特性: 1.涉及大量文字,圖片,文字樣式的展示與編輯。 2.涉及極其複雜的使用者互動。 目前Github上我所瞭解的富文字編輯器基本上實現方式基於兩種: * 1.基於WebView

文字編輯Java實現

import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import javax.swing.text.*; public class Text_ed

文字編輯實現

react-draft-wysiwyg是文字編輯器的外掛 draftjs-to-html是把文字變成HTML的外掛 引入的東西到npm去看 這時編輯器已經顯示出來了。 下面實現清空內容和獲取html文字 實現清空內容 獲取html文字 引

小程式實現文字編輯轉換

gitHub:https://github.com/icindy/wxParse 1.在 js 中引入 wxParse.js 2.在 wxss 中引入 wxParse.js 3.通過呼叫WxParse.wxParse方法來設定html內容 4.在頁面中引用模版

ssm+maven專案中加入“百度富文字編輯”,實現圖片上傳

1.在UEditor官方下載編輯器。2.解壓壓縮檔案到資料夾,因為預設的資料夾名字過長,建議重新命名一下資料夾名,我這裡命名為ueditor資料夾中對應的目錄為3.將整個資料夾copy到專案webapp目錄下,(我這裡用的是IDEA,不知道什麼原因直接往IDEA開啟的專案裡拷

qt文字編輯

QQ:609162385 https://blog.csdn.net/cqltbe131421 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTextCharF

文字編輯UEditor自定義工具欄(一、基礎配置與字型、背景色、行間距、超連結實現

導讀:UEditor 是由百度「FEX前端研發團隊」開發的所見即所得富文字web編輯器,功能強大,可定製,是一款優秀的國產線上富文字編輯器,編輯器內可插入圖片、音訊、視訊等。 一、UEditor自定義工具欄效果圖如下: 二、UEditor富文字編輯器環境搭建及專案引用 環境搭建不再贅述,請自行查閱或者參考以

文字編輯WangEditor,實現圖片上傳OSS雲端儲存

首先,下載WangEditor外掛,下載地址:https://github.com/wangfupeng1988/wangEditor/releases,下載最新的就好了,使用文件地址:第二步,解壓檔案

線上文字編輯實現原理

from: https://io-meter.com/2014/09/01/contenteditable-and-selection/ 最近研究了一下在瀏覽器中實現的 WYSIWYG 文字編輯器的原理, 在瞭解基本原理並瀏覽了 zenpen 這個相對簡單的線上編輯器

HTML線上文字編輯實現原理

相信很多人都使用過多種富文字編輯器,富文字編輯器常用於編輯部落格、使用者互動,富文字編輯器分為兩種:所見即所得和非所見即所得 兩種富文字編輯器的實現原理是不相同的。 1. 非所見即所得編輯器 這種編輯器的實現原理很簡單,用textarea元素就可以實現,假如要實現粗體、斜體

利用 javascript 實現文字編輯

近期專案中需要開發一個相容PC和移動端的富文字編輯器,其中包含了一些特殊的定製功能。考察了下現有的js富文字編輯器,桌面端的很多,移動端的幾乎沒有。桌面端以UEditor為代表。但是我們並不打算考慮相容性,所以沒有必要採用UEditor這麼重的外掛。為此決定自研一個富文字編輯器。本文,主要介紹如何實現富文