我正在尝试"打印"单个图像上包含文本的项目。
我有子类QGraphicsTextItem
或其他使用painter->drawText()
的类。
我可以在Qt4中完成 - 但在Qt5中,我得到的只是一些blob。我试图尝试一个小样本程序,但我无法弄清楚发生了什么...
这是一个简单的自包含程序:
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsTextItem>
class TextItem : public QGraphicsItem
{
public:
TextItem(){}
virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem*, QWidget* = NULL)
{
QPen p(Qt::red);
painter->setPen(p);
painter->setBrush(Qt::NoBrush);
//painter->setFont(QFont("Arial", 30));
painter->drawText(boundingRect(), Qt::AlignCenter, "abcd");
}
virtual QRectF boundingRect() const { return QRectF(0, 0, 30, 20); }
};
void processScene(QGraphicsScene* s) {
QGraphicsTextItem* t = new QGraphicsTextItem();
t->setPlainText("abcd");
// t->setDefaultTextColor(Qt::red); // won't make a difference
t->setPos(0, 0);
s->addItem(t);
//t->setFont(QFont("Arial", 30));
//t->setTransform(t->transform().fromScale(3,3));
TextItem* t1 = new TextItem();
t1->setPos(0, 20);
s->addItem(t1);
QImage image = QImage(s->sceneRect().size().toSize(),
QImage::Format_Mono);
//QImage::Format_RGB32); // this works in qt5
image.fill(QColor(Qt::color0).rgb());
QPainter painter;
painter.begin(&image);
s->render(&painter);
painter.end();
image.save(QString("../test.bmp"));
}
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QGraphicsScene s;
s.setSceneRect(0, 0, 50, 50);
QGraphicsView view(&s);
view.show();
processScene(&s);
return app.exec();
}
在Qt4中运行它可以提供预期效果:输出包含文本的单声道图像(在两个版本中,使用QGraphicsTextItem
或paint->drawText()
(左图)。
Qt5中的相同内容仅显示一些blob代替文本(右图):
我尝试了各种各样的实验...设置字体并没有什么区别(除了QGraphicsTextItem
,将字体设置为大而且缩放到大的东西 - 但这不是在实际应用中很有用。)
在Qt5中工作的另一件事是渲染到彩色图像而不是单色 - 但这对我的应用来说非常糟糕,我需要存储小的单声道图像。那么,对于Qt5,我的想法是将文本渲染为颜色位图,然后将其转换为单声道...但是真的!
我还尝试将项目本身保存到位图中,在类中实现的函数中 - 它做了同样的事情。
在应用之前,我尝试在QFont
上设置磅值
我可以在QPainter
上设置其他内容来绘制文字吗?
我发现了一个相关问题:QT5 Text rendering issue也在Qt论坛中再次提问:QT5 Text rendering issue。但是这个问题涉及所有渲染,以及基于MIPS平台的Alpha中的Qt5 ......这意味着其他平台不会看到该问题......
我使用的是5.5.0 ......我也在windows下运行......渲染彩色图像......以及......
我根本不理解&#34;解决方案&#34;:
暂时,当我们强行尝试启用Glyph缓存时,那么 我们没有看到这个问题。
不确定这意味着什么,以及如何做。
为什么qt5中的单色图像上的文字绘画斑点(但在彩色图像上很好),我该怎么做才能修复它?
在Windows 7中使用Qt 5.5.0 32位
修改 1)我测试了5.4.2中的代码,它正确地呈现文本 我试着比较qpainter.cpp,qtextlayout.cpp,qpaintengine_raster.cpp,qtextengine.cpp中的一些相关代码。 - 但由于我的理解有限,Qt 5.4.2和Qt 5.5.0之间的变化看似合乎逻辑......并且不会影响行为......
2)我确实在一个颜色QImage
上绘制了我的文字,然后在单声道上绘制它 - 它在我自己的文本项目上工作正常,但是创建非常小的文本的第三方软件给我提供了非常糟糕的分辨率我尝试相同(难以辨认)。