使用QTextEdit中的图像复制HTML

时间:2017-09-18 00:22:53

标签: html qt clipboard

我是初学者,所以简单易懂。 :) 我用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

1 个答案:

答案 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