9
9
#include < QBuffer>
10
10
#include < QClipboard>
11
11
#include < QUuid>
12
+ #include < QRegularExpression>
12
13
13
14
const QString Util::REG_AUTORUN = " HKEY_CURRENT_USER\\ SOFTWARE\\ Microsoft\\ Windows\\ CurrentVersion\\ Run" ; // HKEY_CURRENT_USER仅仅对当前用户有效,但不需要管理员权限
14
15
@@ -63,6 +64,34 @@ QByteArray Util::clipboardData(bool* isText)
63
64
*isText = !clipData->hasImage (); // 有可能同时hasText,所以以image为准
64
65
}
65
66
if (clipData->hasImage ()) {
67
+ static auto extractFilePath = [](const QString& str) {
68
+ static QRegularExpression re (" filepath=\" ([^\" ]*)\" " );
69
+ QRegularExpressionMatch match = re.match (str);
70
+ if (match.hasMatch ()) {
71
+ return match.captured (1 );
72
+ } else {
73
+ return QString ();
74
+ }
75
+ };
76
+
77
+ // 貌似不同软件的mime格式不一样,这里只处理QQ
78
+ // "<QQRichEditFormat><Info version=\"1001\"></Info><EditElement type=\"1\" imagebiztype=\"7\" textsummary=\"[崇拜]\"
79
+ // filepath=\"E:\\xxx\\Tencent Files\\xxx\\Image\\C2C\\Image8\\a611951b0d...681d24c21a94c.gif\" shortcut=\"\">
80
+ // </EditElement></QQRichEditFormat>"
81
+ auto qqRichData = QString::fromUtf8 (clipData->data (" application/x-qt-windows-mime;value=\" QQ_Unicode_RichEdit_Format\" " ));
82
+ auto imagePath = extractFilePath (qqRichData); // 正则提取路径
83
+ // .gif 特殊处理,因为QImage不支持gif的Write,如果直接转换为jpg只会保留一帧
84
+ if (imagePath.endsWith (" .gif" )) {
85
+ QFile file (imagePath);
86
+ if (file.open (QIODevice::ReadOnly)) {
87
+ data = file.readAll ();
88
+ file.close ();
89
+ return data;
90
+ } else {
91
+ qCritical () << " Unable to open the file:" << imagePath;
92
+ }
93
+ }
94
+
66
95
// format: application/x-qt-image
67
96
QImage image = qvariant_cast<QImage>(clipData->imageData ()); // 不能直接toByteArray,需要先转换为QImage,否则为空
68
97
if (!image.isNull ()) {
@@ -71,7 +100,8 @@ QByteArray Util::clipboardData(bool* isText)
71
100
image.save (&buffer, " jpg" ); // 将 QImage 保存为 jpg 格式
72
101
buffer.close ();
73
102
// data = data.toBase64(); // 转换为 Base64 编码,防止老式设备进行隐式编解码导致信息丢失
74
- }
103
+ } else
104
+ qWarning () << " WARN: QImage is null" ;
75
105
} else if (clipData->hasText ()) {
76
106
data = clipData->text ().toUtf8 ();
77
107
} else {
0 commit comments