我有这个设置:

// ...

// variable document is a QTextDocument* which has some 'RichText' + 'Images'

QTextEdit textEdit;

textEdit.setDocument(document);

textEdit.setLineWrapMode(QTextEdit::LineWrapMode::NoWrap);

auto image = QImage(document->size().width(), document->size().height(),
                       QImage::Format_ARGB32_Premultiplied);

image.fill(Qt::transparent);

QPainter painter(&image);

document->drawContents(&painter);

// ...
我这样做是为了使文本在水平的长QImage中呈现(因此使用“NoWrap” LineWrapMode),因此我可以一次使用QImage::copy(QRect)选择一小部分并创建滚动文本效果。
我这样做的原因是,我需要在末尾有一个QImage,然后将其缓冲区(QImage::bits())馈送到我用作最终输出的硬件。
因此它很好用,它显示带有字体和颜色的格式化文本以及除图像以外的所有内容,似乎跳过了它们,并注意到“带有图像的文本结果”图片中的文件图标。
这是仅编辑器中的文本

这是纯文字的结果

这是带有编辑器中图像的文本

这是带有图片的文字的结果

这是我将图像插入QTextDocument的方式:
QImage image(url.toLocalFile());

if (image.isNull())
    return;

image = image.scaledToHeight(getDocumentHeight(), Qt::SmoothTransformation);

auto filename = QUrl(url.fileName());

textEdit->document()->addResource(QTextDocument::ImageResource, filename, image);

textEdit->textCursor().insertImage(filename);
所以我不认为这是因为“DrawContents”找不到图像资源文件或类似的东西。
我该怎么办?有什么我想念的吗?非常感谢您提供任何帮助! ;)

最佳答案

在下面的代码中,我演示了如何加载图像,然后将其保存到文件中,可能的错误是您尚未完成绘制,为此,您必须调用painter.end()或从内存中删除painter。

main.cpp

#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget widget;
    QVBoxLayout vlayout(&widget);
    QTextEdit textEdit;
    QPushButton button("save image");
    QPushButton loadButton("Load and Insert");
    vlayout.addWidget(&loadButton);
    vlayout.addWidget(&textEdit);
    vlayout.addWidget(&button);

    widget.show();

    textEdit.append("some text");

    QObject::connect(&loadButton, &QPushButton::clicked,[&textEdit](){
        QString filename =  QFileDialog::getOpenFileName(&textEdit, "Select", "", "*.png");
        if(!filename.isEmpty()){
            QImage image(filename);
            QUrl url = QUrl::fromLocalFile(filename);
            image = image.scaledToHeight(100, Qt::SmoothTransformation);
            textEdit.document()->addResource(QTextDocument::ImageResource, url, image);
            textEdit.textCursor().insertImage(image);
        }
    });

    QObject::connect(&button, &QPushButton::clicked, [&textEdit](){
        QImage image(textEdit.document()->size().toSize() , QImage::Format_ARGB32_Premultiplied);
        image.fill(Qt::transparent);
        QPainter painter(&image);
        textEdit.document()->drawContents(&painter);
        painter.end();
        image.save("image.png");

    });

    return a.exec();
}

08-06 00:47
查看更多