gpt4 book ai didi

c++ - 从 .SVG 文件创建 QIcon 后为空

转载 作者:行者123 更新时间:2023-11-28 04:01:47 27 4
gpt4 key购买 nike

我正在做一个基于 Embedded Linux 的项目和 Qt 5.7 .在文件系统上,我有 SVG image file我想把它变成 PNG Image file .我在互联网上搜索并找到了实现此类任务的几种解决方案 here .但是,我没有 SVG module安装,我被迫使用 QIcon approach :

void ApplicationFlowDataManager::slotCreateQrCode(const QString& qrCodeContents)
{
qDebug() << Q_FUNC_INFO
<< QImageWriter::supportedImageFormats();

const QString GENERATED_QR_CODE_SVG=QString("/home/root/qrCodeGenerated.svg");
const QString GENERATED_QR_CODE_PNG=QString("/home/root/qrCodeGenerated.png");

qrcodegen::QrCode qr0=qrcodegen::QrCode::encodeText(qrCodeContents.toLocal8Bit().data(),
qrcodegen::QrCode::Ecc::MEDIUM);
QString createdQrCode=QString::fromStdString(qr0.toSvgString(4));

QFile qrCodeSVG(GENERATED_QR_CODE_SVG,
this);
qrCodeSVG.open(QIODevice::WriteOnly|QIODevice::Text);
qrCodeSVG.write(createdQrCode.toUtf8());
qrCodeSVG.close();

QImage imageQrCodePNG=QIcon(GENERATED_QR_CODE_SVG).pixmap(QSize(256,
256)).toImage(); // <---- here is problem, QIcon is NULL and QImage has size QSize(0, 0) and therfore its save method returns false and no .PNG is created
imageQrCodePNG.save(GENERATED_QR_CODE_PNG);
} // slotCreateQrCode

问题是创建的 QIconNULL,就像我在有问题的代码行中描述的那样。 SVG 文件存在,我已经对其进行了 100 次检查。我还检查了分区上的低可用空间,没关系,我检查了 /home/root/ 权限,它们不是问题,因为 SVG 文件被 build 。目录 /home/root/ 没有以任何方式被锁定,这是什么问题?

P.S.:对于 QR Code 处理,我使用 Nayuki QR Code Generator Library .

最佳答案

说明:

根据文件扩展名的类型,QIcon 使用插件提供的 QIconEngine,如果文件具有 .svg 扩展名,请尝试使用 Qt SVG 模块提供的处理该格式的插件,因此在您的如果您没有那个插件,因为您没有模块,那么 QIcon 将为空。

解决方案:

您必须使用QrCode 的getModule 方法中的信息来手动进行绘制:

#include <QtWidgets>

#include <QrCode.hpp>

static QImage slotCreateQrCode(const QString& qrCodeContents)
{
qrcodegen::QrCode qr0=qrcodegen::QrCode::encodeText(qrCodeContents.toLocal8Bit().constData(),
qrcodegen::QrCode::Ecc::MEDIUM);

const int s = qr0.getSize();
const int margin = 1;
QImage imageQrCodePNG((s + 2 * margin) * QSize(1, 1), QImage::Format_Mono);

{
QPainter painter(&imageQrCodePNG);
painter.fillRect(imageQrCodePNG.rect(), Qt::white);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::black);
for (int i = 0; i < s ; ++i)
{
for (int j = 0; j < s; ++j)
{
if(qr0.getModule(i, j))
painter.drawRect(i + margin, j + margin, 1, 1);
}
}

}
return imageQrCodePNG;
} // slotCreateQrCode

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

QImage image = slotCreateQrCode("Stack Overflow");

const QSize size(512, 512);

QLabel label;
label.setPixmap(QPixmap::fromImage(image.scaled(size)));
label.setFixedSize(size);
label.show();

return a.exec();
}

enter image description here

关于c++ - 从 .SVG 文件创建 QIcon 后为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59405296/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com