QT实现文本编辑器

ui界面


在这里插入图片描述

.h文件

#ifndef DEMANDEDIT_H
#define DEMANDEDIT_H

#include <QWidget>
#include <QList>
#include <QToolButton>
#include <QMap>
#include <QPointer>
#include <QTextTable>

QT_BEGIN_NAMESPACE
class QAction;
class QComboBox;
class QFontComboBox;
class QTextCharFormat;
QT_END_NAMESPACE

namespace Ui {
class DemandEdit;
}

class DemandEdit : public QWidget
{
    Q_OBJECT

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

	void setCurrentFileName(const QString &fileName);

	bool load(const QString &f);

private slots:
	bool fileSaveAs();
	bool fileSave();

	//当前字符格式更改
	void currentCharFormatChanged(const QTextCharFormat &format);

	//光标位置更改
	void cursorPositionChanged();

	//打开文件
    void on_btn_open_clicked();
	//保存文件
    void on_btn_save_clicked();
	//撤销
    void on_btn_undo_clicked();
	//还原
    void on_btn_redo_clicked();
	//剪切
    void on_btn_cut_clicked();
	//复制
    void on_btn_copy_clicked();
	//粘贴
    void on_btn_paste_clicked();
	//加粗
    void on_btn_bold_clicked();
	//倾斜
    void on_btn_italic_clicked();
	//下划线
    void on_btn_underline_clicked();
	//左对齐
    void on_btn_left_clicked();
	//居中
    void on_btn_center_clicked();
	//右对齐
    void on_btn_right_clicked();
	//两端对齐
    void on_btn_justify_clicked();
	//颜色
    void on_btn_color_clicked();
	//插入图片
	void on_btn_picture_clicked();
	//插入表格
    void on_btn_table_clicked();
	//字体样式(标记类型)
    void on_cb_sign_activated(const int &styleIndex);
	//字体
    void on_cb_font_activated(const QString &arg1);
	//字号
	void on_cb_size_activated(const QString &arg1);

	//剪切板数据变化
	void clipboardDataChanged();
	
	//表格菜单
	void on_ContextMenuRequested(const QPoint & pos);
	//添加行
	void AddRowTriggerAction();
	//添加列
	void AddColumnTriggerAction();
	//删除行
	void DeleteRowTriggerAction();
	//删除列
	void DeleteColumnTriggerAction();
	//全选
	void SelectAllTriggerAction();
	
	//调整行间距
    void on_lineHeightspinBox_valueChanged(const QString &arg1);
private:
	//初始化
	void Init();

	void mergeFormatOnWordOrSelection(const QTextCharFormat &format);
	//字体改变
	void fontChanged(const QFont &f);
	//颜色改变
	void colorChanged(const QColor &c);
	//对齐方式改变
	void alignmentChanged(Qt::Alignment a);

private:
    Ui::DemandEdit *ui;

	QString m_fileName;
};

#endif // DEMANDEDIT_H

.cpp文件

#include "DemandEdit.h"
#include "ui_DemandEdit.h"

#include <QFile>
#include <QFileDialog>
#include <QFileInfo>
#include <QMessageBox>
#include <QTextDocumentWriter>
#include <QColorDialog>
#include <QFontComboBox>
#include <QTextCodec>
#include <QTextCursor>
#include <QTextList>
#include <QClipboard>//剪切板
#include <QApplication>
#include <QMimeData>
#include <QImageReader>
#include <QTextTableCellFormat>
#include <QInputDialog>
#include <QMenu>

#pragma execution_character_set("utf-8")

DemandEdit::DemandEdit(QWidget *parent /*= 0*/) :
    QWidget(parent),
    ui(new Ui::DemandEdit)
{
    ui->setupUi(this);

	//初始化
	Init();

	//当前字符更改信号
	connect(ui->textEdit, SIGNAL(currentCharFormatChanged(const QTextCharFormat &)),
		this, SLOT(currentCharFormatChanged(const QTextCharFormat &)));
	//光标位置更改信号
	connect(ui->textEdit, SIGNAL(cursorPositionChanged()),
		this, SLOT(cursorPositionChanged()));

	connect(ui->textEdit->document(), SIGNAL(modificationChanged(bool)),
		ui->btn_save, SLOT(setEnabled(bool)));
	connect(ui->textEdit->document(), &QTextDocument::modificationChanged,
		this, &QWidget::setWindowModified);
	connect(ui->textEdit->document(), SIGNAL(undoAvailable(bool)),
		ui->btn_undo, SLOT(setEnabled(bool)));
	connect(ui->textEdit->document(),SIGNAL(redoAvailable(bool)),
		ui->btn_redo, SLOT(setEnabled(bool)));

	setWindowModified(ui->textEdit->document()->isModified());
	ui->btn_save->setEnabled(ui->textEdit->document()->isModified());
	ui->btn_undo->setEnabled(ui->textEdit->document()->isUndoAvailable());
	ui->btn_redo->setEnabled(ui->textEdit->document()->isRedoAvailable());

	connect(QApplication::clipboard(), &QClipboard::dataChanged, this, &DemandEdit::clipboardDataChanged);

	//右键菜单
	ui->textEdit->setContextMenuPolicy(Qt::CustomContextMenu);
	connect(ui->textEdit, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(on_ContextMenuRequested(const QPoint &)));

}

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

//初始化
void DemandEdit::Init()
{
	//初始化标签下拉框
	ui->cb_sign->addItem("Standard");
	ui->cb_sign->addItem("Bullet List (Disc)");
	ui->cb_sign->addItem("Bullet List (Circle)");
	ui->cb_sign->addItem("Bullet List (Square)");
	ui->cb_sign->addItem("Ordered List (Decimal)");
	ui->cb_sign->addItem("Ordered List (Alpha lower)");
	ui->cb_sign->addItem("Ordered List (Alpha upper)");
	ui->cb_sign->addItem("Ordered List (Roman lower)");
	ui->cb_sign->addItem("Ordered List (Roman upper)");

	//初始化字号下拉框
	const QList<int> standardSizes = QFontDatabase::standardSizes();
	foreach(int size, standardSizes)
		ui->cb_size->addItem(QString::number(size));
	ui->cb_size->setCurrentIndex(standardSizes.indexOf(QApplication::font().pointSize()));

	//加粗
	QFont bold;
	bold.setBold(true);
	ui->btn_bold->setFont(bold);
	ui->btn_bold->setCheckable(true);

	//倾斜
	QFont italic;
	italic.setItalic(true);
	ui->btn_italic->setFont(italic);
	ui->btn_italic->setCheckable(true);

	//下划线
	QFont underline;
	underline.setUnderline(true);
	ui->btn_underline->setFont(underline);
	ui->btn_underline->setCheckable(true);

	ui->btn_left->setShortcut(Qt::CTRL + Qt::Key_L);
	ui->btn_left->setCheckable(true);

	ui->btn_center->setShortcut(Qt::CTRL + Qt::Key_E);
	ui->btn_center->setCheckable(true);

	ui->btn_right->setShortcut(Qt::CTRL + Qt::Key_R);
	ui->btn_right->setCheckable(true);

	ui->btn_justify->setShortcut(Qt::CTRL + Qt::Key_J);
	ui->btn_justify->setCheckable(true);

	QFont textFont("Helvetica");
	textFont.setStyleHint(QFont::SansSerif);
	ui->textEdit->setFont(textFont);
	fontChanged(ui->textEdit->font());
	colorChanged(ui->textEdit->textColor());
	alignmentChanged(ui->textEdit->alignment());
	
//行间距 默认设为10
	ui->lineHeightspinBox->setValue(10);
	on_lineHeightspinBox_valueChanged(QString("10"));
}

void DemandEdit::setCurrentFileName(const QString &fileName)
{
	m_fileName = fileName;
	ui->textEdit->document()->setModified(false);

	QString shownName;
	if (fileName.isEmpty())
		shownName = "untitled.txt";
	else
		shownName = QFileInfo(fileName).fileName();

	setWindowModified(false);
}

bool DemandEdit::load(const QString &f)
{
	if (!QFile::exists(f))
		return false;
	QFile file(f);
	if (!file.open(QFile::ReadOnly))
		return false;

	QByteArray data = file.readAll();
	QTextCodec *codec = Qt::codecForHtml(data);
	QString str = codec->toUnicode(data);
	if (Qt::mightBeRichText(str)) 
	{
		ui->textEdit->setHtml(str);
	}
	else 
	{
		str = QString::fromLocal8Bit(data);
		ui->textEdit->setPlainText(str);
	}

	setCurrentFileName(f);
	return true;
}

bool DemandEdit::fileSave()
{
	if (m_fileName.isEmpty())
		return fileSaveAs();
	if (m_fileName.startsWith(QStringLiteral(":/")))
		return fileSaveAs();

	QTextDocumentWriter writer(m_fileName);
	bool success = writer.write(ui->textEdit->document());
	if (success)
	{
		ui->textEdit->document()->setModified(false);
		QMessageBox::information(this, QString("提示"), QString("Wrote %1").arg(QDir::toNativeSeparators(m_fileName)));
	}
	else
	{
		QMessageBox::information(this, QString("提示"), QString("Could not write to file %1").arg(QDir::toNativeSeparators(m_fileName)));
	}

	return success;
}

bool DemandEdit::fileSaveAs()
{
	QFileDialog fileDialog(this, tr("Save as..."));
	fileDialog.setAcceptMode(QFileDialog::AcceptSave);
	QStringList mimeTypes;
	mimeTypes << "application/vnd.oasis.opendocument.text" << "text/html" << "text/plain";
	fileDialog.setMimeTypeFilters(mimeTypes);
	fileDialog.setDefaultSuffix("odt");
	if (fileDialog.exec() != QDialog::Accepted)
		return false;
	const QString fn = fileDialog.selectedFiles().first();
	setCurrentFileName(fn);
	return fileSave();
}

void DemandEdit::mergeFormatOnWordOrSelection(const QTextCharFormat &format)
{
	QTextCursor cursor = ui->textEdit->textCursor();
	if (!cursor.hasSelection())
		cursor.select(QTextCursor::WordUnderCursor);
	cursor.mergeCharFormat(format);
	ui->textEdit->mergeCurrentCharFormat(format);
}

//************************************
// 方法名称:	fontChanged
// 概要:		字体变化
// 方法全称:	DemandEdit::fontChanged
// 访问权限:	private 
// 返回值:		void
// 参数:		const QFont & f 
//************************************
void DemandEdit::fontChanged(const QFont & f)
{
	ui->cb_font->setCurrentIndex(ui->cb_font->findText(QFontInfo(f).family()));
	ui->cb_size->setCurrentIndex(ui->cb_size->findText(QString::number(f.pointSize())));
	ui->btn_bold->setChecked(f.bold());
	ui->btn_italic->setChecked(f.italic());
	ui->btn_underline->setChecked(f.underline());
}

//************************************
// 方法名称:	colorChanged
// 概要:		颜色变化
// 方法全称:	DemandEdit::colorChanged
// 访问权限:	private 
// 返回值:		void
// 参数:		const QColor & c
//************************************
void DemandEdit::colorChanged(const QColor & c)
{
    QPixmap pix(20, 20);
	pix.fill(c);
	ui->btn_color->setIcon(pix);
}

//************************************
// 方法名称:	alignmentChanged
// 概要:		对齐方式变化
// 方法全称:	DemandEdit::alignmentChanged
// 访问权限:	private 
// 返回值:		void
// 参数:		Qt::Alignment a
//************************************
void DemandEdit::alignmentChanged(Qt::Alignment a)
{
	if (a & Qt::AlignLeft)
	{
		ui->btn_left->setChecked(true);
		ui->btn_center->setChecked(false);
		ui->btn_right->setChecked(false);
		ui->btn_justify->setChecked(false);
	}
	else if (a & Qt::AlignHCenter)
	{
		ui->btn_center->setChecked(true);
		ui->btn_left->setChecked(false);
		ui->btn_right->setChecked(false);
		ui->btn_justify->setChecked(false);
	}
	else if (a & Qt::AlignRight)
	{
		ui->btn_right->setChecked(true);
		ui->btn_left->setChecked(false);
		ui->btn_center->setChecked(false);
		ui->btn_justify->setChecked(false);
	}
	else if (a & Qt::AlignJustify)
	{
		ui->btn_justify->setChecked(true);
		ui->btn_left->setChecked(false);
		ui->btn_center->setChecked(false);
		ui->btn_right->setChecked(false);
	}
}

//************************************
// 方法名称:	cursorPositionChanged
// 概要:		光标位置更改
// 方法全称:	DemandEdit::cursorPositionChanged
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::cursorPositionChanged()
{
	alignmentChanged(ui->textEdit->alignment());
}

//************************************
// 方法名称:	on_btn_undo_clicked
// 概要:		打开按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_undo_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_open_clicked()
{
	QFileDialog fileDialog(this, tr("Open File..."));
	fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
	fileDialog.setFileMode(QFileDialog::ExistingFile);

	fileDialog.setNameFilter(tr("Files (*.doc *.docx)"));
	if (fileDialog.exec() != QDialog::Accepted)
		return;
	const QString fn = fileDialog.selectedFiles().first();
	if (!load(fn))
	{
		QMessageBox::information(this, QString("提示"), QString("Could not open %1").arg(QDir::toNativeSeparators(fn)));
	}
	
}

//************************************
// 方法名称:	on_btn_undo_clicked
// 概要:		保存按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_undo_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_save_clicked()
{
	fileSave();
}

//************************************
// 方法名称:	on_btn_undo_clicked
// 概要:		撤销按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_undo_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_undo_clicked()
{
	ui->textEdit->undo();
}

//************************************
// 方法名称:	on_btn_redo_clicked
// 概要:		还原按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_redo_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_redo_clicked()
{
	ui->textEdit->redo();
}

//************************************
// 方法名称:	on_btn_cut_clicked
// 概要:		剪切按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_cut_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_cut_clicked()
{
	ui->textEdit->cut();
}

//************************************
// 方法名称:	on_btn_copy_clicked
// 概要:		复制按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_copy_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_copy_clicked()
{
	ui->textEdit->copy();
}

//************************************
// 方法名称:	on_btn_paste_clicked
// 概要:		粘贴按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_paste_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_paste_clicked()
{
	ui->textEdit->paste();
	if (const QMimeData *md = QApplication::clipboard()->mimeData())
		ui->btn_paste->setEnabled(md->hasText());
}

//************************************
// 方法名称:	on_btn_bold_clicked
// 概要:		加粗按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_bold_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_bold_clicked()
{
	QTextCharFormat fmt;
	fmt.setFontWeight(ui->btn_bold->isChecked() ? QFont::Bold : QFont::Normal);
	mergeFormatOnWordOrSelection(fmt);
}

//************************************
// 方法名称:	on_btn_italic_clicked
// 概要:		倾斜按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_italic_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_italic_clicked()
{
	QTextCharFormat fmt;
	fmt.setFontItalic(ui->btn_italic->isChecked());
	mergeFormatOnWordOrSelection(fmt);
}

//************************************
// 方法名称:	on_btn_italic_clicked
// 概要:		下划线按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_italic_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_underline_clicked()
{
	QTextCharFormat fmt;
	fmt.setFontUnderline(ui->btn_underline->isChecked());
	mergeFormatOnWordOrSelection(fmt);
}

//************************************
// 方法名称:	on_btn_left_clicked
// 概要:		左对齐按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_left_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_left_clicked()
{
	ui->textEdit->setAlignment(Qt::AlignLeft | Qt::AlignAbsolute);

	ui->btn_left->setChecked(true);
	ui->btn_center->setChecked(false);
	ui->btn_right->setChecked(false);
	ui->btn_justify->setChecked(false);
}

//************************************
// 方法名称:	on_btn_center_clicked
// 概要:		居中对齐按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_center_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_center_clicked()
{
	ui->textEdit->setAlignment(Qt::AlignHCenter);

	ui->btn_left->setChecked(false);
	ui->btn_center->setChecked(true);
	ui->btn_right->setChecked(false);
	ui->btn_justify->setChecked(false);
}

//************************************
// 方法名称:	on_btn_right_clicked
// 概要:		右对齐按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_right_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_right_clicked()
{
	ui->textEdit->setAlignment(Qt::AlignRight | Qt::AlignAbsolute);

	ui->btn_left->setChecked(false);
	ui->btn_center->setChecked(false);
	ui->btn_right->setChecked(true);
	ui->btn_justify->setChecked(false);
}

//************************************
// 方法名称:	on_btn_justify_clicked
// 概要:		两端对齐按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_justify_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_justify_clicked()
{
	ui->textEdit->setAlignment(Qt::AlignJustify);

	ui->btn_left->setChecked(false);
	ui->btn_center->setChecked(false);
	ui->btn_right->setChecked(false);
	ui->btn_justify->setChecked(true);
}

//************************************
// 方法名称:	on_btn_color_clicked
// 概要:		文本颜色按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_color_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_color_clicked()
{
	QColor col = QColorDialog::getColor(ui->textEdit->textColor(), this);
	if (!col.isValid())
		return;
	QTextCharFormat fmt;
	fmt.setForeground(col);
	mergeFormatOnWordOrSelection(fmt);
	colorChanged(col);
}

//************************************
// 方法名称:	on_btn_picture_clicked
// 概要:		添加图片按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_picture_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_picture_clicked()
{
	QFileDialog fileDialog(this, tr("Open File..."));
	fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
	fileDialog.setFileMode(QFileDialog::ExistingFile);
	//筛选图片格式
	fileDialog.setNameFilter(tr("Image (*.bmp *.jpg *jpe *.gif *.png)"));
	if (fileDialog.exec() != QDialog::Accepted)
		return;
	const QString fn = fileDialog.selectedFiles().first();
	//获取图片路径
	QUrl Uri(QString("file://%1").arg(fn));
	//加载图片
	QImage image = QImageReader(fn).read();
	//插入图片
	QTextDocument * textDocument = ui->textEdit->document();
	textDocument->addResource(QTextDocument::ImageResource, Uri, QVariant(image));
	QTextCursor cursor = ui->textEdit->textCursor();
	QTextImageFormat imageFormat;
	imageFormat.setWidth(image.width());
	imageFormat.setHeight(image.height());
	imageFormat.setName(Uri.toString());
	cursor.insertImage(imageFormat);
}

//************************************
// 方法名称:	on_btn_table_clicked
// 概要:		插入表格按钮点击槽函数
// 方法全称:	DemandEdit::on_btn_table_clicked
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::on_btn_table_clicked()
{
	int rows, cols;
	double padding;
	bool ok;
	rows = QInputDialog::getInt(this, QString("获取行数"), QString("行:"), 1, 1, 10000, 1, &ok);
	if (!ok)
		return;
	cols = QInputDialog::getInt(this, QString("获取列数"), QString("列:"), 1, 1, 10000, 1, &ok);
	if (!ok)
		return;
	padding = QInputDialog::getDouble(this, QString("设置单元格大小"), QString("像素:"), 1, 1, 100, 1, &ok);
	if (!ok)
		return;

	QTextTableFormat fmt;
	fmt.setCellPadding(padding);
	fmt.setAlignment(ui->textEdit->alignment());

	QTextTable * table = ui->textEdit->textCursor().insertTable(rows, cols, fmt);
}

//************************************
// 方法名称:	on_cb_sign_activated
// 概要:		文本样式(标记)下拉框槽函数
// 方法全称:	DemandEdit::on_cb_sign_activated
// 访问权限:	private 
// 返回值:		void
// 参数:		const int &styleIndex
//************************************
void DemandEdit::on_cb_sign_activated(const int &styleIndex)
{
	QTextCursor cursor = ui->textEdit->textCursor();

	if (styleIndex != 0) 
	{
		QTextListFormat::Style style = QTextListFormat::ListDisc;

		switch (styleIndex) 
		{
		default:
		case 1:
			style = QTextListFormat::ListDisc;
			break;
		case 2:
			style = QTextListFormat::ListCircle;
			break;
		case 3:
			style = QTextListFormat::ListSquare;
			break;
		case 4:
			style = QTextListFormat::ListDecimal;
			break;
		case 5:
			style = QTextListFormat::ListLowerAlpha;
			break;
		case 6:
			style = QTextListFormat::ListUpperAlpha;
			break;
		case 7:
			style = QTextListFormat::ListLowerRoman;
			break;
		case 8:
			style = QTextListFormat::ListUpperRoman;
			break;
		}

		cursor.beginEditBlock();

		QTextBlockFormat blockFmt = cursor.blockFormat();

		QTextListFormat listFmt;

		if (cursor.currentList()) 
		{
			listFmt = cursor.currentList()->format();
		}
		else 
		{
			listFmt.setIndent(blockFmt.indent() + 1);
			blockFmt.setIndent(0);
			cursor.setBlockFormat(blockFmt);
		}

		listFmt.setStyle(style);

		cursor.createList(listFmt);

		cursor.endEditBlock();
	}
	else 
	{
		QTextBlockFormat bfmt;
		bfmt.setObjectIndex(-1);
		cursor.mergeBlockFormat(bfmt);
	}
}

//************************************
// 方法名称:	on_cb_font_activated
// 概要:		字体下拉框槽函数
// 方法全称:	DemandEdit::on_cb_font_activated
// 访问权限:	private 
// 返回值:		void
// 参数:		const QString &arg1
//************************************
void DemandEdit::on_cb_font_activated(const QString &arg1)
{
	QTextCharFormat fmt;
	fmt.setFontFamily(arg1);
	mergeFormatOnWordOrSelection(fmt);
}

//************************************
// 方法名称:	on_cb_size_activated
// 概要:		字号下拉框槽函数
// 方法全称:	DemandEdit::on_cb_size_activated
// 访问权限:	private 
// 返回值:		void
// 参数:		const QString &arg1
//************************************
void DemandEdit::on_cb_size_activated(const QString &arg1)
{
	qreal pointSize = arg1.toFloat();
	if (arg1.toFloat() > 0)
	{
		QTextCharFormat fmt;
		fmt.setFontPointSize(pointSize);
		mergeFormatOnWordOrSelection(fmt);
	}
}

//************************************
// 方法名称:	clipboardDataChanged
// 概要:		剪切板数据变化
// 方法全称:	DemandEdit::clipboardDataChanged
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::clipboardDataChanged()
{
#ifndef QT_NO_CLIPBOARD
	if (const QMimeData *md = QApplication::clipboard()->mimeData())
	{
		bool flag = md->hasText();
		ui->btn_paste->setEnabled(flag);
	}
#endif
}

//************************************
// 方法名称:	currentCharFormatChanged
// 概要:		当前字符格式更改
// 方法全称:	DemandEdit::currentCharFormatChanged
// 访问权限:	private 
// 返回值:		void
// 参数:		const QTextCharFormat &format
//************************************
void DemandEdit::currentCharFormatChanged(const QTextCharFormat &format)
{
	fontChanged(format.font());
	colorChanged(format.foreground().color());
}

//************************************
// 方法名称:	on_ContextMenuRequested
// 概要:		显示菜单
// 方法全称:	DemandEdit::on_ContextMenuRequested
// 访问权限:	private 
// 返回值:		void
// 参数:		const QPoint &
//************************************
void DemandEdit::on_ContextMenuRequested(const QPoint & pos)
{
	QMenu contextMenu;

	//添加菜单项
	QAction* actionUndo = new QAction(&contextMenu);
	actionUndo->setObjectName("撤销");
	actionUndo->setText(tr("撤销"));
	actionUndo->setShortcut(Qt::CTRL + Qt::Key_Z);
	actionUndo->setIcon(QIcon(":/resource/images/editredo.png"));

	QAction* actionRedo = new QAction(&contextMenu);
	actionRedo->setObjectName("还原");
	actionRedo->setText(tr("还原"));
	actionRedo->setShortcut(Qt::CTRL + Qt::Key_Y);
	actionRedo->setIcon(QIcon(":/resource/images/editundo.png"));

	QAction* actionCut = new QAction(&contextMenu);
	actionCut->setObjectName("剪切");
	actionCut->setText(tr("剪切"));
	actionCut->setShortcut(Qt::CTRL + Qt::Key_X);
	actionCut->setIcon(QIcon(":/resource/images/editcut.png"));

	QAction* actionCopy = new QAction(&contextMenu);
	actionCopy->setObjectName("复制");
	actionCopy->setText(tr("复制"));
	actionCopy->setShortcut(Qt::CTRL + Qt::Key_C);
	actionCopy->setIcon(QIcon(":/resource/images/editcopy.png"));

	QAction* actionPaste = new QAction(&contextMenu);
	actionPaste->setObjectName("粘贴");
	actionPaste->setText(tr("粘贴"));
	actionPaste->setShortcut(Qt::CTRL + Qt::Key_V);
	actionPaste->setIcon(QIcon(":/resource/images/editpaste.png"));
	
	QAction* actionAddRow = new QAction(&contextMenu);
	actionAddRow->setObjectName("添加行");
	actionAddRow->setText(tr("添加行"));
	actionAddRow->setIcon(QIcon(":/resource/images/add.png"));

	QAction* actionAddColumn = new QAction(&contextMenu);
	actionAddColumn->setObjectName("添加列");
	actionAddColumn->setText(tr("添加列"));
	actionAddColumn->setIcon(QIcon(":/resource/images/add.png"));

	QAction* actionDeleteRow = new QAction(&contextMenu);
	actionDeleteRow->setObjectName("删除行");
	actionDeleteRow->setText(tr("删除行"));
	actionDeleteRow->setIcon(QIcon(":/resource/images/remove.png"));

	QAction* actionDeleteColumn = new QAction(&contextMenu);
	actionDeleteColumn->setObjectName("删除列");
	actionDeleteColumn->setText(tr("删除列"));
	actionDeleteColumn->setIcon(QIcon(":/resource/images/remove.png"));

	QAction* actionSelectAll = new QAction(&contextMenu);
	actionSelectAll->setObjectName("全选");
	actionSelectAll->setText(tr("全选"));
	actionSelectAll->setShortcut(Qt::CTRL + Qt::Key_A);
	actionSelectAll->setIcon(QIcon(":/resource/images/selectAll.png"));

	contextMenu.addAction(actionUndo);
	contextMenu.addAction(actionRedo);
	contextMenu.addAction(actionCut);
	contextMenu.addAction(actionCopy);
	contextMenu.addAction(actionPaste);
	contextMenu.addAction(actionAddRow);
	contextMenu.addAction(actionAddColumn);
	contextMenu.addAction(actionDeleteRow);
	contextMenu.addAction(actionDeleteColumn);
	contextMenu.addAction(actionSelectAll);

	//撤销
	connect(actionUndo, SIGNAL(triggered()), this, SLOT(on_btn_undo_clicked()));
	//还原
	connect(actionRedo, SIGNAL(triggered()), this, SLOT(on_btn_redo_clicked()));
	//剪切
	connect(actionCut, SIGNAL(triggered()), this, SLOT(on_btn_cut_clicked()));
	//复制
	connect(actionCopy, SIGNAL(triggered()), this, SLOT(on_btn_cut_clicked()));
	//粘贴
	connect(actionPaste, SIGNAL(triggered()), this, SLOT(on_btn_paste_clicked()));
	//添加行
	connect(actionAddRow, SIGNAL(triggered()), this, SLOT(AddRowTriggerAction()));
	//添加列
	connect(actionAddColumn, SIGNAL(triggered()), this, SLOT(AddColumnTriggerAction()));
	//删除行
	connect(actionDeleteRow, SIGNAL(triggered()), this, SLOT(DeleteRowTriggerAction()));
	//删除列
	connect(actionDeleteColumn, SIGNAL(triggered()), this, SLOT(DeleteColumnTriggerAction()));
	//全选
	connect(actionSelectAll, SIGNAL(triggered()), this, SLOT(SelectAllTriggerAction()));


	QTextTable * table = ui->textEdit->textCursor().currentTable();
	if (table == nullptr)
	{
		actionAddRow->setEnabled(false);
		actionAddColumn->setEnabled(false);
		actionDeleteRow->setEnabled(false);
		actionDeleteColumn->setEnabled(false);
	}

	actionUndo->setEnabled(ui->btn_undo->isEnabled());
	actionRedo->setEnabled(ui->btn_redo->isEnabled());
	actionCut->setEnabled(ui->btn_cut->isEnabled());
	actionCopy->setEnabled(ui->btn_copy->isEnabled());
	actionPaste->setEnabled(ui->btn_paste->isEnabled());

	//显示菜单
	contextMenu.exec(ui->textEdit->mapToGlobal(pos));
}

//************************************
// 方法名称:	AddRowTriggerAction
// 概要:		添加行
// 方法全称:	DemandEdit::AddRowTriggerAction
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::AddRowTriggerAction()
{
	QTextTable * table = ui->textEdit->textCursor().currentTable();
	if (table == nullptr) return;

	bool ok;
	int rows = QInputDialog::getInt(this, QString("添加行数"), QString("行:"), 1, 1, 10000, 1, &ok);
	if (!ok) return;

	table->appendRows(rows);
}

//************************************
// 方法名称:	AddColumnTriggerAction
// 概要:		添加列
// 方法全称:	DemandEdit::AddColumnTriggerAction
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::AddColumnTriggerAction()
{
	QTextTable * table = ui->textEdit->textCursor().currentTable();
	if (table == nullptr) return;

	bool ok;
	int cols = QInputDialog::getInt(this, QString("添加列数"), QString("列:"), 1, 1, 10000, 1, &ok);
	if (!ok) return;

	table->appendColumns(cols);
}

//************************************
// 方法名称:	DeleteRowTriggerAction
// 概要:		删除行
// 方法全称:	DemandEdit::DeleteRowTriggerAction
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::DeleteRowTriggerAction()
{
	QTextTable * table = ui->textEdit->textCursor().currentTable();
	if (table == nullptr) return;

	int pos = table->cellAt(ui->textEdit->textCursor()).row();

	QMessageBox msgbox(QMessageBox::Information, QString("提示"), QString("确定删除所在行?"), QMessageBox::No | QMessageBox::Yes, this);
	msgbox.setDefaultButton(QMessageBox::No);
	if (QMessageBox::Yes != msgbox.exec())
	{
		return;
	}

	table->removeRows(pos, 1);
}

//************************************
// 方法名称:	DeleteColumnTriggerAction
// 概要:		删除列
// 方法全称:	DemandEdit::DeleteColumnTriggerAction
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::DeleteColumnTriggerAction()
{
	QTextTable * table = ui->textEdit->textCursor().currentTable();
	if (table == nullptr) return;

	int pos = table->cellAt(ui->textEdit->textCursor()).column();

	QMessageBox msgbox(QMessageBox::Information, QString("提示"), QString("确定删除所在列?"), QMessageBox::No | QMessageBox::Yes, this);
	msgbox.setDefaultButton(QMessageBox::No);
	if (QMessageBox::Yes != msgbox.exec())
	{
		return;
	}

	table->removeColumns(pos, 1);
}

//************************************
// 方法名称:	SelectAllTriggerAction
// 概要:		全选
// 方法全称:	DemandEdit::SelectAllTriggerAction
// 访问权限:	private 
// 返回值:		void
// 参数:		void
//************************************
void DemandEdit::SelectAllTriggerAction()
{
	ui->textEdit->selectAll();
}
//************************************
// 方法名称:	on_lineHeightspinBox_valueChanged
// 概要:		设置行间距
// 方法全称:	DemandEdit::on_lineHeightspinBox_valueChanged
// 访问权限:	private
// 返回值:		void
// 参数:		const QString &arg1
//************************************
void DemandEdit::on_lineHeightspinBox_valueChanged(const QString &arg1)
{
    //设置文字行间距
    QTextBlockFormat blockFormat;
    blockFormat.setLineHeight(arg1.toInt(), QTextBlockFormat::LineDistanceHeight);
    auto textCursor = ui->textEdit->textCursor();
    textCursor.setBlockFormat(blockFormat);
    ui->textEdit->setTextCursor(textCursor);
}

运行效果


在这里插入图片描述
支持打开文件、保存文件
撤销、恢复、剪切、复制、粘贴、加粗、倾斜、下划线、左对齐、居中、右对齐、两端对齐
字体颜色设置、插入表格和图片

完整工程代码

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值