Qt 实现的文本编辑器

时间:2022-11-18 10:39:32


<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();
}