簡體   English   中英

初始化Qb中的QPainter#drawText seg錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM