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(
(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這麼重的外掛。為此決定自研一個富文字編輯器。本文,主要介紹如何實現富文