2016-06-02 7 views
0

Frage:QApplication Verfahren setStyleSheet von anderen Thread aufgerufen verursacht Segmentierungsfehler

Was ist die Ursache von Segmentierungsfehler sein könnte?

oder

Wie kann ich Hintergrundbild ändern.

schrieb ich:

static QApplication *_app; 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    _app = &app; 
    ... 
    app.setStyleSheet(ReadStyleSheet(STYLE_SHEET_WITH_BLUE_SCREEN)); 
    ... 
} 

// called with STYLE_SHEET_WITH_BLUE_SCREEN 
void qtobeapp_setStyleSheet(int typeOfSheet) 
{ 
    syslog(LOG_DEBUG, "main: qtobeapp_setStyleSheet typeOfSheet[%d] _app[%p] 5", typeOfSheet, _app); 
    _app->setStyleSheet(ReadStyleSheet(typeOfSheet)); 
    syslog(LOG_DEBUG, "main: qtobeapp_setStyleSheet typeOfSheet[%d] _app[%p] 5", typeOfSheet, _app); 
} 

, wenn ich rufe qtobeapp_setStyleSheet (STYLE_SHEET_WITH_BLUE_SCREEN); von anderen Thread

ich bekommen:

Jun 2 17:37:30 Viper user.debug QT_OBEAPP: main: qtobeapp_setStyleSheet typeOfSheet[1] _app[0xbffceab4] 5 
Jun 2 17:37:30 Viper user.debug QT_OBEAPP: signal_handler: SIGNAL [11] caught. Sending PID: 0, UID: 11 
Jun 2 17:37:30 Viper user.debug QT_OBEAPP: main: qtobeapp_setStyleSheet typeOfSheet[1] _app[0xbffceab4] 5 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: signal_handler: SIGNAL [11] caught. Stack trace size: 24 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /afc/obe/QT_OBEAPP [0x1002697c] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: [0x100374] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtGui.so.4 [0xea97498] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtGui.so.4 [0xea99060] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtGui.so.4 [0xea9d6a0] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtGui.so.4(_ZNK14QWidgetPrivate15paintBackgroundEP8QPainterRK7QRegioni+0x1a0) [0xe711808] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtGui.so.4(_ZN14QWidgetPrivate10drawWidgetEP12QPaintDeviceRK7QRegionRK6QPointiP8QPainterP19QWidgetBackingStore+0x3f0) [0xe71bb0c] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtGui.so.4 [0xe902a48] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtGui.so.4(_ZN14QWidgetPrivate16syncBackingStoreEv+0xa8) [0xe70c100] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtGui.so.4(_ZN7QWidget5eventEP6QEvent+0x7f4) [0xe71d7d4] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtGui.so.4(_ZN11QMainWindow5eventEP6QEvent+0x100) [0xeb78028] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtGui.so.4(_ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent+0xe4) [0xe6b8578] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtGui.so.4(_ZN12QApplication6notifyEP7QObjectP6QEvent+0x26c) [0xe6bf8cc] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtCore.so.4(_ZN16QCoreApplication14notifyInternalEP7QObjectP6QEvent+0xa8) [0xe20f4c8] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtCore.so.4(_ZN23QCoreApplicationPrivate16sendPostedEventsEP7QObjectiP11QThreadData+0x348) [0xe210ab0] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtCore.so.4(_ZN16QCoreApplication16sendPostedEventsEP7QObjecti+0x34) [0xe210c7c] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtGui.so.4 [0xe74c74c] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtCore.so.4(_ZN10QEventLoop13processEventsE6QFlagsINS_17ProcessEventsFlagEE+0x60) [0xe20e34c] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtCore.so.4(_ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE+0xdc) [0xe20e568] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtCore.so.4(_ZN16QCoreApplication4execEv+0xe4) [0xe210d80] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libQtGui.so.4(_ZN12QApplication4execEv+0x30) [0xe6b7924] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /afc/obe/QT_OBEAPP(main+0x380) [0x100267a8] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libc.so.6 [0xdf076a0] 
Jun 2 17:37:32 Viper user.err QT_OBEAPP: /lib/libc.so.6 [0xdf07824] 

Ohne Anruf qtobeapp_setStyleSheet (STYLE_SHEET_WITH_BLUE_SCREEN) ;, alles gut funktioniert.

Was könnte der Grund für einen Segmentierungsfehler sein?

oder

Wie kann ich Hintergrundbild ändern.

Danke

+0

Ich würde ein Signal und einen Steckplatz dafür verwenden, damit die Änderung im GUI-Thread passiert. – drescherjm

+0

Rufen Sie die Funktion im Hauptthread auf. –

+0

Sie benötigen keinen globalen statischen QApplication-Zeiger. Sie erhalten es bereits in Form von ['qApp'] (http://doc.qt.io/qt-5/qapplication.html#qApp). Sie können ['QMetaObject :: invokeMethod'] (http://doc.qt.io/qt-5/qmetaobject.html#invokeMethod) verwenden, um' QApplication :: setStylesheet' von einem anderen Thread aufzurufen. – thuga

Antwort

0

Vielen Dank an alle,

I verwendet QMetaObject :: InvokeMethod QApplication :: setStylesheet und es funktionierte zu nennen.

Genau ich rief Qtobeapp_setStyleSheet (int typeOfSheet) durch QMetaObject :: invokeMethod.

Verwandte Themen