2014-02-20 51 views
1

我有一个非常简单的应用程序来为图片添加水印。所以你可以把你的照片放在一个QListWidget中,它会显示一个缩略图和路径,调整一些东西,如文本,透明度,输出格式等。按开始后,它将版权图片保存在您的目的地选择。这与QPainter一起使用,可以在图片上绘制徽标和文字。Qt-应用程序意外地杀死字符(drawText产生bug)

一切都能正常工作。但这里有神奇的bug:

该应用程序会杀死随机字母。这很奇怪,因为我无法复制它。每次执行和选项组合都不同。例如:

  • 有时候,我不能写在我的界面QLineEdit的一些字母(如E,4和0犯规存在,或者他改变字母所以一些特殊标志)。
  • QListWidget中的项目文本没有完整显示,有时缺少完整性。但我可以正常提取文本并使用路径。
  • 执行时,我有一个QTextBrowser作为日志显示一些有趣的东西,如字体大小。尽管字体在结果图片上显示得非常正常,但它会显示“4”或“6”,而不是更高和正确的尺寸。有时在一些字母之间出现奇怪的白色块
  • 当使用QPainter在图片上绘制文本时,还有字母丢失。有时候,所有的字母都印在彼此之上。这似乎是用小pixelsizes时(如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); 
    

并非所有这些错误的出现一次!有时我没有任何错误...

也许有人有过类似的bug之前。不幸的是,我在互联网上没有发现类似的东西。我没有发布很多代码片段,因为我认为(并希望)这是一个常见问题。如果您需要具体的帮助我的东西,请让我知道=)

我添加了一个例子图片:

  • 在我干脆写ABCDEFGHIJKLMNOPQRSTUVWXYZ(看什么,他已与7,做的lineEdit 9)
  • 在画面的下角这个小广场应该是“ABC ......”事情
  • 的“62”看起来在textBrowser

很奇怪

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

编辑:每次加入的第一张照片到列表中后,他发现这些警告:

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

但是,当我改变高度(与它的字体的pointsize)其不再发射,甚至与开始参数。

编辑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

它几乎听起来就像你在你的过程中破坏随机存储器,或者你有一个非常坏的Windows安装。可能你的字体请求是由一个非常糟糕的系统字体匹配的。

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

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

0

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