QTextDocument::DrawContents 跳过资源?
QTextDocument::DrawContents skips resources?
我有这个设置:
// ...
// 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),所以我可以 select 一次 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()
或从中删除画家内存。
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();
}
我有这个设置:
// ...
// 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),所以我可以 select 一次 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()
或从中删除画家内存。
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();
}