initializeDb 中的 QPainter#drawText 段错误
QPainter#drawText seg faults in initializeDb
使用Qt 5.7,Windows7,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
调用中的段错误,给出以下堆栈跟踪,以 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
为什么会发生这种情况,我该如何避免这种情况?
.pro 文件,为了完整性:
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() 由于某种原因 returning NULL。
查看源代码我们看到 QGuiApplicationPrivate::platformIntegration() 在这里定义,在 gui/kernel/qguiapplication.h:
的第 103 行
static QPlatformIntegration *platformIntegration()
{ return platform_integration; }
... 如果 platform_integration 变量尚未设置为指向任何有效对象,则该方法肯定 return NULL。
通过更多的 grepping,我们发现设置 platform_integration 静态变量的唯一位置是 gui/kernel/qguiapplication.cpp:
的第 1094 行
QGuiApplicationPrivate::platform_integration = QPlatformIntegrationFactory::create(name, arguments, argc, argv, platformPluginPath);
... 是名为 init_platform() 的静态函数的一部分,它是从 QGuiApplicationPrivate::createPlatformIntegration() 调用的,它本身是从 QGuiApplicationPrivate [=41= 的各种方法调用的].
但是当然可以调用 none 的 QGuiApplicationPrivate 方法 unless/until 创建了一个 QGuiApplicationPrivate 对象,这可能不会发生 unless/until 您已经创建了一个 QGuiApplication 对象。
所以总而言之...看起来 Rinold 是正确的,您需要先实例化 QGuiApplication(或 QApplication,它是 QGuiApplication 的子class)对象,然后再尝试使用 QPainter绘制文本。
使用Qt 5.7,Windows7,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
调用中的段错误,给出以下堆栈跟踪,以 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
为什么会发生这种情况,我该如何避免这种情况?
.pro 文件,为了完整性:
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() 由于某种原因 returning NULL。
查看源代码我们看到 QGuiApplicationPrivate::platformIntegration() 在这里定义,在 gui/kernel/qguiapplication.h:
的第 103 行static QPlatformIntegration *platformIntegration()
{ return platform_integration; }
... 如果 platform_integration 变量尚未设置为指向任何有效对象,则该方法肯定 return NULL。
通过更多的 grepping,我们发现设置 platform_integration 静态变量的唯一位置是 gui/kernel/qguiapplication.cpp:
的第 1094 行QGuiApplicationPrivate::platform_integration = QPlatformIntegrationFactory::create(name, arguments, argc, argv, platformPluginPath);
... 是名为 init_platform() 的静态函数的一部分,它是从 QGuiApplicationPrivate::createPlatformIntegration() 调用的,它本身是从 QGuiApplicationPrivate [=41= 的各种方法调用的].
但是当然可以调用 none 的 QGuiApplicationPrivate 方法 unless/until 创建了一个 QGuiApplicationPrivate 对象,这可能不会发生 unless/until 您已经创建了一个 QGuiApplication 对象。
所以总而言之...看起来 Rinold 是正确的,您需要先实例化 QGuiApplication(或 QApplication,它是 QGuiApplication 的子class)对象,然后再尝试使用 QPainter绘制文本。