我是初学者,所以简单易懂。 :) 我用C ++编写了程序,现在我用Qt构建了一个UI。
在程序的一部分中,我有一个QTextEdit,用户可以复制其内容并将其粘贴到Word等文本编辑器中(用于进一步输入,格式化,打印等)。内容是一个表,其中包含一些单元格中资源文件的一些图像。它是用HTML制作的(我无法弄清楚如何做到这一点)。将它复制到Word工作得很好,除了图像被粘贴为小空白方块的事实(当随机的HTML片段与Web上的图像粘贴到QTextEdit BTW中时会发生同样的事情。)
我无法正确地将图像粘贴到Word中(并且没有 - 未检查Word中的显示图片占位符选项)。因此,我的问题是 - 如何正确地粘贴QTextEdit中的HTML(包含文本和图片)?
相关代码段的简化版本(:/ imgs / imgs / Fonotest16x16.png 是资源文件路径):
QString textEditContents = "<html><head/><body><table><tr><td><p>";
textEditContents.append("some QStrings the program made");
textEditContents.append("</p></td><td><p>Some text here <img src=':/imgs/imgs/Fonotest16x16.png'/></p></td>");
textEditContents.append("</tr></table></body></html>");
ui->textEdit->setText(textEditContents);
将QTextEdit变形为QTextBrowser会得到相同的结果。
我有一种感觉,使用QMimeData类可能会有效,但我是初学者,尽管我已经阅读过它,但它太混乱了,我不知道如何使用它。我已经找到了简单的例子,我无法弄清楚,所以一个更简单的解决方案会很棒,或者至少是如何将它与上面给出的代码一起使用的一个例子。 :d
(顺便说一下,非本地人,所以如果我的语法不好 - 道歉。)
为清楚起见,发生了什么的截图:
复制:
粘贴:
与此同时,我尝试了这个:
QMimeData *data = new QMimeData;
data->setHtml(textEditContents);
QClipboard *clipboard = QGuiApplication::clipboard();
clipboard->setMimeData(data, QClipboard::Mode::Clipboard);
当然,它没有用。事实上,它不会将任何内容复制到剪贴板,它什么都不做。 :d
答案 0 :(得分:1)
您可以执行此操作,例如如下:
使用
将所选文本(包括图像)复制到剪贴板QTextEdit::copy();
现在,阅读剪贴板中的内容并检查HTML。它将包含<img src="resource_name" ...>
标签。您将需要使用资源名称将图像存储在QTextDocument中。
(...)
void zcTextEdit::doCopyOrCutNow()
{
QClipboard *clipboard = QApplication::clipboard();
if (clipboard != nullptr) {
QMimeData *md_new = this->copyMimeData(clipboard->mimeData());
if (md_new != nullptr) {
// Add images here in the HTML
if (md_new->hasHtml()) {
// check for <img stuff
QString s = md_new->html();
QRegExp re("<img\\s+src=[\"]([^\"]+)");
int idx = re.indexIn(s);
zcTextDocument *D = doc();
while (idx >= 0) {
QString name = re.cap(1);
QString img_str = QString("data:image/jpg;base64,");
{
QImage img = D->getImageResource(name);
QBuffer imgbuf;
imgbuf.open(QIODevice::WriteOnly);
img.save(&imgbuf, "JPG");
imgbuf.close();
img_str.append(imgbuf.buffer().toBase64());
}
int l = img_str.length();
s = s.left(idx) +
"<img src=\"" +
img_str +
s.mid(idx + re.cap(0).length());
idx += l - re.cap(1).length();
idx = re.indexIn(s, idx);
}
md_new->setHtml(s);
}
clipboard->setMimeData(md_new);
}
}
}
(...)
QMimeData *zcTextEdit::copyMimeData(const QMimeData *md)
{
QMimeData *md_new = new QMimeData();
QStringList formats = md->formats();
foreach(QString format, formats) {
QByteArray ba(md->data(format));
md_new->setData(format, ba);
}
return md_new;
}
(...)
现在,图像已添加到剪贴板,并将粘贴到Word / LibreOffice Writer文档中。
注意zcTextDocument
已从QTextDocument继承来处理图像和图像资源。您可以咨询Qt documentation for that。