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);
}
运行效果
支持打开文件、保存文件
撤销、恢复、剪切、复制、粘贴、加粗、倾斜、下划线、左对齐、居中、右对齐、两端对齐
字体颜色设置、插入表格和图片