簡體   English   中英

Qt在“調試”模式下正確呈現此SVG,但在“發布”模式下沒有

[英]Qt renders this SVG correctly in “debug” mode but not in “release”

我遇到了這個奇怪的問題,當我構建調試和鏈接調試dll(Qt 5.12.2,開源)時,我得到了預期的渲染。

當我為發布而構建並鏈接發布dll時,圖像完全空白。 程序從MSVC運行,因此應正確設置dll路徑。 有人知道發生了什么事嗎?

#include <QApplication>
#include <QSvgRenderer>
#include <QPainter>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //https://commons.wikimedia.org/wiki/File:USAF-1951.svg
    QSvgRenderer renderer(QString("USAF-1951.svg"));
    QImage image(512, 512, QImage::Format_Grayscale8);
    QPainter painter(&image);
    renderer.render(&painter);
    image.save("USAF-1951.bmp");
    return 0;
}

我嘗試了一些其他SVG圖像,它們似乎工作。 不確定這個圖像是什么。

OP在他的自我回答中提供了正確的解決方案,但錯過了解釋為什么這是必要的。 所以,我會介入:

Qt doc。 關於QImage::QImage()

QImage :: QImage(int width,int height,QImage :: Format format)

構造具有給定寬度,高度和格式的圖像。

如果無法分配內存,將返回空圖像。

警告:這將創建一個包含未初始化數據的QImage。 在使用QPainter繪制圖像之前,調用fill()以使用適當的像素值填充圖像。

(強調我的。)

未初始化意味着圖像像素字節中可能存在任何值。 如果它都是0秒,那么alpha值也將是0秒。 這可以解釋為什么沒有出現。

現在,另外要注意為什么這可能在調試模式下有效:

OP明確提到了MSVC。 MS人員試圖為調試提供最好的支持,並決定用例如CD代表“已分配但尚未初始化”的模式填充每個分配的內存(在調試模式下)。 (有關此內容的更多信息: SO:在Visual Studio C ++中,內存分配表示是什么?

有時,它真的很有幫助。 將此位模式解釋為floatdouble產生非常奇怪的數字(通過一點點經驗很容易識別),並且十六進制視圖中的積分值變得非常明顯。

但是,這有一些缺點:未初始化的bool將始終在調試模式下“初始化”為true (某種程度上),它在發布中具有任意值。 →最可想象的事故:調試運行但偶爾發布失敗。 (我最缺乏的錯誤。)

在OP的情況下,它(可能)類似:在調試模式下,圖像始終為淺灰色背景,不透明度足以在發布模式下忽略意外的透明度...見上文。 (或者,OP可能會產生一種噪音模式,就像過去午夜后從電視中得知的一樣。不確定,這是否有助於進一步......)

顯然,如果我在調試和發布中按預期設置背景。

#include <QApplication>
#include <QSvgRenderer>
#include <QPainter>
//https://stackoverflow.com/questions/55895293/qt-renders-this-svg-correctly-in-debug-mode-but-not-in-release
int main(int argc, char *argv[])
{
    //https://commons.wikimedia.org/wiki/File:USAF-1951.svg
    QApplication a(argc, argv);
    QSvgRenderer renderer(QString("USAF-1951.svg"));
    QImage image(512, 512, QImage::Format_Grayscale8);
    image.fill(255);//<- Need to set background
    QPainter painter(&image);
    renderer.render(&painter);
    image.save("Test.bmp");
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM