[英]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
調用上出現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()最有可能返回NULL。
仔細查看源代碼,我們看到在gui / kernel / qguiapplication.h的第103行中定義了QGuiApplicationPrivate :: platformIntegration():
static QPlatformIntegration *platformIntegration()
{ return platform_integration; }
...因此,如果尚未將platform_integration變量設置為指向任何有效對象,則該方法肯定可以返回NULL。
經過一番摸索,我們發現設置platform_integration靜態變量的唯一位置是gui / kernel / qguiapplication.cpp的第1094行:
QGuiApplicationPrivate::platform_integration = QPlatformIntegrationFactory::create(name, arguments, argc, argv, platformPluginPath);
...是稱為init_platform()的靜態函數的一部分,該函數從QGuiApplicationPrivate :: createPlatformIntegration()調用,該函數本身從QGuiApplicationPrivate類的各種方法中調用。
但是,當然,除非/直到創建QGuiApplicationPrivate對象,否則才能調用QGuiApplicationPrivate方法,除非/直到您創建了QGuiApplication對象,否則不會發生。
因此,總結起來……看起來Rinold是正確的,您需要先實例化一個QGuiApplication(或QApplication,它是QGuiApplication的子類)對象,然后再嘗試使用QPainter繪制文本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.