QPainter#drawText seg在initializeDb中出错
QPainter#drawText seg faults in initializeDb
使用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的子类(对象。
- 访问者访问变体并返回不同类型时出错
- 在Linux for Windows上编译C++代码时出错
- 读取文件的最后一行并输入到链接列表时出错
- 重载操作程序时出错>>用于类中的字符串 memebr
- 调用专用模板时出错"no matching function for call to [...]"
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 在Google Kick start中提交时出错
- 在c++中访问int到类对象的映射时出错
- 分段错误当我试图运行程序时出错
- 使用dynamic_cast和构造函数时出错
- CHECK(调用)函数在Google Colab中出错
- 用pybind11包装C++抽象类时出错
- 为x86而非x64编译时出错
- 从R调用C++函数并对其进行集成时出错
- 这个函数哪里出错了
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 为重写std::exception的库生成swig接口时出错
- 导入/导出变量时出错
- QPainter#drawText seg在initializeDb中出错