【问题标题】:Copying HTML with images from QTextEdit使用来自 QTextEdit 的图像复制 HTML
【发布时间】:2020-09-09 05:46:14
【问题描述】:

我是一个初学者,所以很简单。 :) 我已经用 C++ 编写了我的程序,现在我正在使用 Qt 构建它的 UI。

在程序的一部分中,我有一个 QTextEdit,用户可以复制其内容并将其粘贴到 Word 等文本编辑器中(用于进一步键入、格式化、打印等)。内容是一个表格,其中包含一些单元格中资源文件的一些图像。它是使用 HTML 制作的(我不知道该怎么做)。将它复制到 Word 效果很好,除了图像被粘贴为小的空白方块这一事实(当带有来自网络的图像的随机 HTML 片段被粘贴到 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

【问题讨论】:

  • 很明显,单词不会显示图像,因为据我了解,您只能复制粘贴文本而不是图像。因此,当文字显示这一行&lt;img src=':/imgs/imgs/Fonotest16x16.png'/&gt;&lt;/p&gt;&lt;/td&gt; 时,它会显示空白图像,因为它根本找不到它。你试过不使用资源系统吗?在 QTextEdit 中使用来自网络的图像?
  • @EligijusPupeikis 好的,但是你怎么能从网络上随机复制一段 HTML 到 Word 中并完美呈现图片呢?我不能使用来自网络的图像,因为那样用户必须有互联网连接才能工作,我不明白。
  • @AndreySemenov 是的,不,我希望用户能够复制带有文本和图像的整个 HTML 表格(是的,图像是重点,但我的意思是整个表格)。您所建议的接缝只会复制图像,而不是其中包含图像的整个 HTML。
  • @Miloš 我唯一的建议是在不将图像放入资源的情况下尝试您正在做的事情。只需直接从文件系统中获取它们。因为 word 或任何其他应用程序无法访问您的应用程序资源中的文件。

标签: html qt clipboard


【解决方案1】:

您可以这样做,例如如下:

将所选文本(包括图像)复制到剪贴板,使用

QTextEdit::copy();

现在,阅读剪贴板的内容并检查 HTML。它将包含&lt;img src="resource_name" ...&gt; 标签。您将需要使用资源名称将图像存储在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 2014-05-25
    • 2012-03-16
    • 1970-01-01
    • 2016-03-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多