-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrichtextedit.cpp
More file actions
119 lines (101 loc) · 3.32 KB
/
richtextedit.cpp
File metadata and controls
119 lines (101 loc) · 3.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "richtextedit.h"
#include <QApplication>
#include <QClipboard>
#include <QEvent>
#if defined(_MSC_VER) && (_MSC_VER >= 1600)
# pragma execution_character_set("utf-8")
#endif
RichTextEdit::RichTextEdit(QWidget *parent):QxTextEdit(parent)
{
m_menu = new QMenu(this);
m_action_copy = new QAction(tr("复制"), m_menu);
m_action_save = new QAction(tr("另存为"), m_menu);
m_menu->addAction(m_action_copy);
m_menu->addAction(m_action_save);
connect(this, SIGNAL(imageRightClicked()), this, SLOT(sltImageRightClicked()));
connect(m_action_copy, SIGNAL(triggered()), this, SLOT(sltCopyImage()));
connect(m_action_save, SIGNAL(triggered()), this, SLOT(sltSaveImage()));
flattenInactivePalette();
qApp->installEventFilter(this);
}
void RichTextEdit::flattenInactivePalette()
{
QPalette p = QApplication::palette();
const QPalette::ColorRole roles[] = {
QPalette::Text, QPalette::Base, QPalette::WindowText,
QPalette::Window, QPalette::Highlight, QPalette::HighlightedText
};
for (QPalette::ColorRole role : roles)
{
p.setColor(QPalette::Inactive, role, p.color(QPalette::Active, role));
}
setPalette(p);
viewport()->setPalette(p);
viewport()->update();
}
bool RichTextEdit::eventFilter(QObject *watched, QEvent *event)
{
if (watched == qApp && event->type() == QEvent::ApplicationPaletteChange)
{
flattenInactivePalette();
}
return QxTextEdit::eventFilter(watched, event);
}
void RichTextEdit::sltImageRightClicked()
{
m_menu->popup(QCursor::pos());
}
void RichTextEdit::sltCopyImage()
{
QTextCursor cursor = textCursor();
if (!cursor.hasSelection() && cursor.charFormat().isImageFormat()) {
QTextImageFormat fmt = cursor.charFormat().toImageFormat();
QImage image = document()->resource(QTextDocument::ImageResource, fmt.name()).value<QImage>();
QClipboard* clip = QApplication::clipboard();
clip->setImage(image);
}
}
void RichTextEdit::sltSaveImage()
{
QTextCursor cursor = textCursor();
if (!cursor.hasSelection() && cursor.charFormat().isImageFormat()) {
QTextImageFormat fmt = cursor.charFormat().toImageFormat();
QImage image = document()->resource(QTextDocument::ImageResource, fmt.name()).value<QImage>();
QString filePath = QFileDialog::getSaveFileName(this, tr("图片另存为"), tr("图片"), tr("Image (*.png)"));
if (filePath.isEmpty())
{
return;
}
image.save(filePath, "png");
}
}
void RichTextEdit::dealBackTab()
{
QTextCursor cur = textCursor();
int pos = cur.position();
int anchor = cur.anchor();
cur.setPosition(pos);
cur.setPosition(pos-1,QTextCursor::KeepAnchor);
if (cur.selectedText() == "\t")
{
cur.removeSelectedText();
cur.setPosition(anchor-1);
cur.setPosition(pos-1,QTextCursor::KeepAnchor);
}
else
{
cur.setPosition(anchor);
cur.setPosition(anchor-1,QTextCursor::KeepAnchor);
if (cur.selectedText() == "\t")
{
cur.removeSelectedText();
cur.setPosition(anchor-1);
cur.setPosition(pos-1,QTextCursor::KeepAnchor);
}
else
{
cur.setPosition(anchor);
cur.setPosition(pos,QTextCursor::KeepAnchor);
}
}
}