2016-10-28 54 views
1
故障

使用Qt 5.7,Windows 7中,MinGW的32位,下面的程序:QPainter的#的drawText SEG在initializeDb

#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沒有什麼區別。

+2

嘗試使用QApplication而不是QCoreApplication。 –

回答

2

查看Qt源代碼可以幫助解決這樣的問題。

896線qfontdatabase.cpp(在您的堆棧跟蹤顯示,在發生的崩潰)的是這樣的:

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

....所以最有可能要麼platformIntegration()或fontDatabase()是返回NULL因爲某些原因。

通過源代碼Grepping我們看到QGuiApplicationPrivate :: platformIntegration()在這裏被定義,在GUI /內核/ qguiapplication.h線103:

static QPlatformIntegration *platformIntegration() 
{ return platform_integration; } 

...所以這個方法肯定可以迴歸如果platform_integration變量尚未設置爲指向任何有效對象,則爲NULL。

只需多一點grepping周圍,我們發現,在platform_integration靜態變量設置的唯一的地方是在GUI /內核/ qguiapplication.cpp的1094行:

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

...這是它是從QGuiApplicationPrivate :: createPlatformIntegration()中調用的稱爲init_platform()的靜態函數的一部分,該函數本身是從QGuiApplicationPrivate類的各種方法中調用的。

但是當然,除非創建QGuiApplicationPrivate對象,否則不會調用QGuiApplicationPrivate方法,除非/直到您創建了QGuiApplication對象,否則可能不會調用QGuiApplicationPrivate方法。

因此,總結一下......看起來Rinold是正確的,在嘗試使用QPainter繪製文本之前,您需要首先實例化QGuiApplication(或QApplication,它是QGuiApplication的一個子類)對象。