QPainter#drawText seg在initializeDb中出错

QPainter#drawText seg faults in initializeDb

本文关键字:出错 initializeDb seg QPainter#drawText      更新时间:2023-10-16

使用Qt 5.7,Windows 7,MinGW 32位,以下程序:

#include <QImage>
#include <QPainter>
int main () {
    QImage i(100, 100, QImage::Format_RGB888);
    QPainter p(&i);
    p.drawText(0, 0, "abc"); // line 7
}

p.drawText调用上的Seg错误,给出以下堆栈跟踪,以initializeDb:结束

1  initializeDb                  qfontdatabase.cpp 896  0x7930ed0 
2  QFontDatabase::findFont       qfontdatabase.cpp 2640 0x79361f6 
3  QFontDatabase::load           qfontdatabase.cpp 2795 0x7936b5e 
4  QFontPrivate::engineForScript qfont.cpp         215  0x79194ff 
5  QTextEngine::fontEngine       qtextengine.cpp   2094 0x793d24b 
6  QTextEngine::shapeText        qtextengine.cpp   1000 0x7938c0b 
7  QTextEngine::shape            qtextengine.cpp   1534 0x793b090 
8  QTextEngine::shapeLine        qtextengine.cpp   938  0x793884a 
9  QPainter::drawText            qpainter.cpp      5877 0x7a3dc91 
10 QPainter::drawText            qpainter.cpp      5700 0x7a3cfe6 
11 QPainter::drawText            qpainter.h        890  0x402a1e  
12 main                          main.cpp          7    0x4016b6  

为什么会发生这种情况?我该如何避免这种情况的发生?

.pr文件,为了完整性:

QT += core gui    
CONFIG += c++11
TARGET = untitled18
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app    
SOURCES += main.cpp

这是用于生成图像的命令行实用程序。

注意:添加QCoreApplication并没有什么区别。

查看Qt源代码可以帮助解决此类问题。

qfontdatabase.cpp的第896行(堆栈跟踪显示崩溃发生在(如下:

QGuiApplicationPrivate::platformIntegration()->fontDatabase()->populateFontDatabase();   

因此,platformIntegration((或fontDatabase((很可能由于某种原因返回NULL。

在源代码中,我们看到QGuiApplicationPrivate::platformIntegration((是在这里定义的,位于gui/kernel/qguiapplication.h:的第103行

static QPlatformIntegration *platformIntegration()
{ return platform_integration; }

因此,如果platform_integration变量尚未设置为指向任何有效对象,则该方法肯定会返回NULL。

再仔细一点,我们发现平台集成静态变量的唯一设置位置是gui/kernel/qgui application.cpp的第1094行:

QGuiApplicationPrivate::platform_integration = QPlatformIntegrationFactory::create(name, arguments, argc, argv, platformPluginPath);

它是一个名为init_platform((的静态函数的一部分,该函数是从QGuiApplicationPrivate::createPlatformIntegration((调用的,该函数本身是从QuiApplicationPrivate类的各种方法调用的。

当然,除非/直到创建了QGuiApplicationPrivate对象,否则不能调用任何QGuiApplicationPrivate方法,而除非/直到您创建了QuiApplication对象,否则这种情况可能不会发生。

综上所述。。。看起来Rinold是正确的,在尝试使用QPainter绘制文本之前,您需要首先实例化一个QGuiApplication(或QApplication,它是QGuiApplication的子类(对象。