我有一个非常简单的应用程序,可以为图片添加水印。因此,您可以将图片放在QListWidget中,它会显示缩略图和路径,调整文本,透明度,输出格式等内容。按下开始后,它会将受版权保护的图片保存在您的目的地中选择。这适用于QPainter,它绘制图片上的徽标和文字。
一切都能正常工作。但这是一个神秘的错误:
该应用程序杀死随机字母。这真的很奇怪,因为我无法重现它。每次执行和选择组合都是不同的。例如:
使用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);
并非所有这些错误都会立刻出现!有时我没有任何错误...
也许有人之前有类似的错误。不幸的是,我没有在互联网上找到这样的东西。我没有发布很多代码片段,因为我认为(并希望)这是一个普遍存在的问题。如果您需要特定的东西来帮助我,请告诉我=)
我添加了一个示例图片:
我在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);
}
答案 0 :(得分:2)
这几乎听起来像是在破坏你的进程中的随机内存,或者你的Windows安装严重受损。可能您的字体请求与选择非常糟糕的系统字体相匹配。
QFont
上设置的内容仅仅是一个请求。要获取所选实际字体的参数,您必须创建QFontInfo
,并从那里获取您的信息。
想象一下,您请求系统上不存在的QFont
,或者无法缩放到特定大小的QFontInfo
。在某些时候,字体对象需要变形来反映真实情况 - 这将是非常令人困惑的。因此,QFontInfo
提供有关实际使用的字体的信息。将QFont
视为回复,将{{1}}视为请求。
答案 1 :(得分:0)
我终于找到了一个解决方案:我只是将Qt从5.0.1更新到5.2.1,现在它可以工作了。也许有人有类似的错误,这篇文章可以帮助他。谢谢你的帮助!