2016-10-28 4 views
1

mit Qt 5.7, Windows 7, MinGW 32-Bit, das folgende Programm:QPainter # drawText seg Fehler in initializeDb

#include <QImage> 
#include <QPainter> 

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

Seg Störungen am p.drawText Anruf, die folgende Stapelüberwachung zu geben, die mit initializeDb endet :

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 

Warum passiert das und wie kann ich es nicht passieren?

Die .proDatei, der Vollständigkeit halber:

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

Dies ist für ein Gebrauchsbefehlszeile, die Bilder erzeugt.

Hinweis: Hinzufügen eines QCoreApplication macht keinen Unterschied.

+2

Probieren Sie QApplication anstelle von QCoreApplication aus. –

Antwort

2

Das Betrachten des Qt-Quellcodes kann bei Problemen wie diesem helfen.

Linie 896 von qfontdatabase.cpp sieht (wo Ihr Stack-Trace zeigt den Absturz auftretende at) wie folgt aus:

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

.... so höchstwahrscheinlich entweder platformIntegration() oder fontDatabase() ist die Rückkehr NULL aus irgendeinem Grund.

Quellcode greppen durch wir sehen, dass QGuiApplicationPrivate :: platformIntegration() hier definiert ist, in Zeile 103 von gui/kernel/qguiapplication.h:

static QPlatformIntegration *platformIntegration() 
{ return platform_integration; } 

... so dass Verfahren könnte auf jeden Fall wieder NULL, wenn die Variable platform_integration noch nicht auf ein gültiges Objekt verweist.

Mit nur ein bisschen mehr greppen um, so finden wir, dass der einzige Ort, an dem das platform_integration statische Variable gesetzt ist an der Leitung ist 1094 von gui/kernel/qguiapplication.cpp:

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

... das ist Teil einer statischen Funktion namens init_platform(), die von QGuiApplicationPrivate :: createPlatformIntegration() aufgerufen wird, die selbst von verschiedenen Methoden der QGuiApplicationPrivate-Klasse aufgerufen wird.

Natürlich kann keine der QGuiApplicationPrivate-Methoden aufgerufen werden, es sei denn,/bis ein QGuiApplicationPrivate-Objekt erstellt wird, was vermutlich nur solange geschieht, bis Sie ein QGuiApplication-Objekt erstellt haben.

Also zusammenzufassen ... es sieht so aus, als ob Rinold korrekt ist, müssen Sie zuerst eine QGuiApplication (oder QApplication, die eine Unterklasse von QGuiApplication) -Objekt instanziieren, bevor Sie einen QPainter verwenden, um Text zu zeichnen.