使用QPainter和QCoreApplication

4
我们有一个应用程序(QCoreApplication),它需要一些图像作为输入,对其进行处理,并重新导出。现在我们需要在这些图像上添加一些文本,并使用QPainter类尝试实现此功能。在我们的另一个应用程序 (使用QApplication) 中使用时效果很好,但在我们的主要 QCoreApplication 应用程序中却不起作用。
以下是代码示例:
void drawTextOnImage(QImage* image, const QString& text, const QFont& font)
{
    QPainter p;
    if (!p.begin(image)) return;

    p.setFont(font);
    p.drawText(image->rect(), Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, text);

    p.end();
}

应用程序在drawText行崩溃。
有什么想法吗?
这是一个非常简单的文本,因此如果不使用Qt的建议也将受到赞赏。

QCoreApplication是控制台应用程序的基类。无法将QCoreApplication与小部件一起使用(而QPainter或QImage依赖于小部件)。您需要使用QApplication。 - markus-nm
1
你可以尝试在 QPixmap 上绘制,而不是在 QImage 上绘制。即,将你的函数更改为:void drawTextOnImage(const QPixmap &image, const QString& text, const QFont& font) - vahancho
1
@markus-nm QPainter 不依赖于小部件,也不需要 QApplication,而是需要一个 QGuiAppication - Benjamin T
2个回答

3

当使用“Qt Gui”中的类,如QPainter时,应该使用QGuiApplication而不是QCoreApplication

如果你运气好的话,可能会在只使用QCoreApplication的情况下使一些GUI功能正常工作。但正如你所发现的那样,这会使你的应用程序变得非常脆弱。有些类,如QPixmap,会打印一个错误消息,但其他类则会直接崩溃。

同样适用于“Qt Widget”:如果使用与小部件相关的类,则必须使用QApplication

请注意,由于QApplication继承自QGuiApplication,因此如果你有一个QApplication,你可以使用“Qt Gui”。


1

如果您需要在没有窗口系统的环境下运行非GUI应用程序,则需要创建一个QGuiApplication实例,并选择适当的Qt平台。

对于我来说,offscreen平台效果很好。我正在使用无头Raspberry Pi生成带有文本元素的图像并将它们保存到文件中。我的代码如下所示。请注意,setenv是一个POSIX函数,可能需要在Windows上进行替换,尽管我不确定无窗口的Windows是否存在。

#include <stdlib.h>
#include <QImage>
#include <QPainter>
#include <QGuiApplication>

int main(int argc, char** argv)
{
    setenv("QT_QPA_PLATFORM","offscreen",1);
    QGuiApplication app(argc,argv);

    QImage img(128,128, QImage::Format_RGB888);
    img.fill(Qt::white);
    QPainter p(&img);
    p.drawText(QPoint(0,64), "Works!");
    img.save("/tmp/test.png");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接