Qt-Application意外杀死了字符(drawText产生bug)

时间:2014-02-20 12:50:31

标签: qt qt5 qpainter

我有一个非常简单的应用程序,可以为图片添加水印。因此,您可以将图片放在QListWidget中,它会显示缩略图和路径,调整文本,透明度,输出格式等内容。按下开始后,它会将受版权保护的图片保存在您的目的地中选择。这适用于QPainter,它绘制图片上的徽标和文字。

一切都能正常工作。但这是一个神秘的错误:

该应用程序杀死随机字母。这真的很奇怪,因为我无法重现它。每次执行和选择组合都是不同的。例如:

  • 有时我不能在我的界面的QLineEdit中写一些字母(比如E,4和0不存在,或者他更改字母以便有些特殊符号)。
  • QListWidget中的项目文本不会完整显示,有时会丢失。但我可以正常提取文本并使用路径。
  • 执行时我有一个QTextBrowser作为日志来显示一些有趣的东西,比如字体大小。虽然字体在结果图片上显示为正常,但它表示“4”或“6”而不是更高和更正确的尺寸。在某些字母之间出现奇怪的白色块
  • 使用QPainter在图片上绘制文字时,也会丢失字母。有时,所有字母都相互打印。使用小像素化(如12)时,似乎更常出现此错误:

        //Text//
    int fontSize = (watermarkHeight-(4*frame));
    int fontX = 2*frame;
    int fontY = (result.height()-(watermarkHeight-2*frame));
    int fontWidth = watermarkWidth;
    QRect place(fontX,fontY,fontWidth,fontSize);
    
    QFont font("Helvetica Neue", QFont::Light);
    font.setPixelSize(fontSize);
    emit log(QString::number(fontSize));
    pixPaint.setFont(font);
    pixPaint.setPen(QColor(255,255,255,textOpacity));
    pixPaint.drawText(place,text);
    

并非所有这些错误都会立刻出现!有时我没有任何错误...

也许有人之前有类似的错误。不幸的是,我没有在互联网上找到这样的东西。我没有发布很多代码片段,因为我认为(并希望)这是一个普遍存在的问题。如果您需要特定的东西来帮助我,请告诉我=)

我添加了一个示例图片:

  • 在lineEdit中我只写了ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890(看看他用7和9做了什么)
  • 图片下角的这个小广场应该是“ABC ......”的东西
  • “62”在textBrowser中看起来很奇怪

example screenshot

我在Windows 7 64位计算机上使用Qt 5.0.1。

编辑:每次将第一张图片添加到列表后,他都会发现这些警告:

QFontEngine::loadEngine: GetTextMetrics failed ()
QWindowsFontEngine: GetTextMetrics failed ()

但是当我改变高度(并使用它的字体的pointSize)时,即使使用start-parameters,它也不再发出。

编辑2:谢谢你的帮助!我更正了我的代码,以便他只使用正确的字体和正确的大小,但它仍然无法正常工作。当我删除QPainter :: drawText()函数时,它工作正常(没有文本)。但是一旦我添加文本,一切都会被窃听。我现在有这样的事情:

    //Text//
    QList<int> smoothSizes = fontDatabase->smoothSizes("Verdana","Standard");
    int fontSize = (watermarkHeight-(4*frame))*0.75;
    emit log("Requested:  "+QString::number(fontSize));

    if(!smoothSizes.contains(fontSize)){
        for(int i = 0; i<smoothSizes.length(); i++){
            if(smoothSizes.at(i) > fontSize && i>0){
                fontSize = smoothSizes.at(i-1);
                break;
            }
        }
    }

    int fontX = 2*frame;
    int fontY = (result.height()-(watermarkHeight/2)+frame);

    QFont font = fontDatabase->font("Verdana","Standard",fontSize);

    QFontInfo info(font);
    emit log("Corrected: "+QString::number(fontSize));
    emit log("Okay?: "+QString::number(info.exactMatch()));

    pixPaint.setFont(font);
    const QFontMetrics fontMetrics = pixPaint.fontMetrics();

    if(info.exactMatch()){
        pixPaint.setPen(QColor(255,255,255,textOpacity));
        pixPaint.drawText(fontX,fontY+(fontMetrics.height()-fontMetrics.ascent()),text);
    }

2 个答案:

答案 0 :(得分:2)

这几乎听起来像是在破坏你的进程中的随机内存,或者你的Windows安装严重受损。可能您的字体请求与选择非常糟糕的系统字体相匹配。

QFont上设置的内容仅仅是一个请求。要获取所选实际字体的参数,您必须创建QFontInfo,并从那里获取您的信息。

想象一下,您请求系统上不存在的QFont,或者无法缩放到特定大小的QFontInfo。在某些时候,字体对象需要变形来反映真实情况 - 这将是非常令人困惑的。因此,QFontInfo提供有关实际使用的字体的信息。将QFont视为回复,将{{1}}视为请求。

答案 1 :(得分:0)

我终于找到了一个解决方案:我只是将Qt从5.0.1更新到5.2.1,现在它可以工作了。也许有人有类似的错误,这篇文章可以帮助他。谢谢你的帮助!