我有一个非常简单的应用程序来为图片添加水印。所以你可以把你的照片放在一个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);
}