QtQuick ChartView QML object seg-неисправности вызывает QML-engine segfault во время загрузки

у меня есть приложение QML со связью (через свойства,Q_INVOKABLE и т. д.) В код C++. Я могу запустить приложение QML без большинства рамок C++, используя qmlscene, и нет никаких очевидных проблем (кроме отсутствующих данных и функциональности, которые должны быть предоставлены со стороны C++).

однако, когда я создаю и развертываю код, я получаю segfault внутри Qt framework во времяQQmlApplicationEngine::load() звонок.

я создал упрощенное "фиктивное" приложение, которое вызвать ту же самую проблему.

C++ App:

#include <QGuiApplication>
#include <QQmlApplicationEngine>

#include "SigCatcher.hpp"  // Proprietary code

int main(
    int argc,
    char *argv[])
{
  SigCatcher sig_catcher;  // Just catches signals & prints stacktrace

  QGuiApplication app(argc, argv);

  QQmlApplicationEngine engine;

  engine.load(
      QUrl(QStringLiteral("qrc:/main.qml")));

  return 0;
}

обратите внимание, что без SigCather, Я все еще получаю segfault, я просто не получаю трассировку стека. Поэтому этот пример воспроизводим, если вы прокомментируете SigCatcher импорт и декларации.

main.qml:

import QtQuick 2.5
import QtQuick.Controls 1.3
import QtCharts 2.0

ApplicationWindow {
    id:  winRoot
    visible: true

    width:  1024 - 24
    height:  768 - 80

    minimumWidth: width
    minimumHeight: height
    maximumHeight: minimumHeight
    maximumWidth: minimumWidth

    ChartView {
        id: sparkline
        anchors.top: parent.top
        anchors.right: parent.right
        anchors.left: parent.left
    }
}

здесь почти ничего нет, что заставляет меня поверить, что ChartView сам тип может иметь жук.

что может быть? я даже не знаю, как это отладить; насколько я знаю, нет даже способа использовать console.log во время engine::load() перед вызовом QGuiApplication::exec().

EDIT: уточнил, что приложение работает правильно с qmlscene (о котором я не знал, когда впервые написал вопрос).

EDIT 2: заменен предыдущий пример, который состоял из тщательно отобранных фрагментов из проприетарного кода с полным непатентованным примером, который показывает ту же проблему (и имеет немного более короткий stacktrace).


платформы: Qt 5.5.1 работает на 64-битном Debian 8; мое приложение скомпилировано с GCC 5.1, но я вижу ту же ошибку с 4.9.2 и предварительной версией Clang 3.7.0, которой сейчас около 6 месяцев. Я также попытался использовать Qt 5.4.0 (который требует импорта QtQuick 2.4 вместо 2.5).

Stacktrace:

../obj/X64_ATOM/debug/GUI/AucLocalGui2(_ZN22TracePrinterImpl_Linux16Print_stackTraceEv+0x42)[0x401e54]
../obj/X64_ATOM/debug/GUI/AucLocalGui2(_ZN12TracePrinter16Print_stackTraceEv+0x9)[0x401e7d]
../obj/X64_ATOM/debug/GUI/AucLocalGui2(_ZN20SigCatcherImpl_Linux15OnCatch_signal_Ei+0x68)[0x4022c6]
/lib/x86_64-linux-gnu/libc.so.6(+0x35180)[0x7fe0a2234180]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Widgets.so.5(_ZN18QWidgetTextControl14setCursorWidthEi+0x55)[0x7fe0a527fb15]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Widgets.so.5(_ZN18QWidgetTextControlC1EP7QObject+0x5d)[0x7fe0a527fced]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Widgets.so.5(+0x443047)[0x7fe0a53a6047]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Widgets.so.5(_ZNK17QGraphicsTextItem8documentEv+0xd)[0x7fe0a53a633d]
/opt/Qt/5.5.1/5.5/gcc_64/qml/QtCharts/../../lib/libQt5Charts.so.2(+0x63821)[0x7fe098d74821]
/opt/Qt/5.5.1/5.5/gcc_64/qml/QtCharts/../../lib/libQt5Charts.so.2(+0x56cd3)[0x7fe098d67cd3]
/opt/Qt/5.5.1/5.5/gcc_64/qml/QtCharts/../../lib/libQt5Charts.so.2(+0x5727d)[0x7fe098d6827d]
/opt/Qt/5.5.1/5.5/gcc_64/qml/QtCharts/../../lib/libQt5Charts.so.2(+0x597d6)[0x7fe098d6a7d6]
/opt/Qt/5.5.1/5.5/gcc_64/qml/QtCharts/../../lib/libQt5Charts.so.2(+0x5bb7c)[0x7fe098d6cb7c]
/opt/Qt/5.5.1/5.5/gcc_64/qml/QtCharts/../../lib/libQt5Charts.so.2(+0x5fb8f)[0x7fe098d70b8f]
/opt/Qt/5.5.1/5.5/gcc_64/qml/QtCharts/libqtchartsqml2.so(+0x2f044)[0x7fe099072044]
/opt/Qt/5.5.1/5.5/gcc_64/qml/QtCharts/libqtchartsqml2.so(+0x16680)[0x7fe099059680]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Qml.so.5(_ZNK8QQmlType6createEv+0x3b)[0x7fe0a436e07b]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Qml.so.5(+0x2cf472)[0x7fe0a43cf472]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Qml.so.5(+0x2cc85d)[0x7fe0a43cc85d]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Qml.so.5(+0x2cd45e)[0x7fe0a43cd45e]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Qml.so.5(+0x2cde8e)[0x7fe0a43cde8e]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Qml.so.5(+0x2cea8b)[0x7fe0a43cea8b]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Qml.so.5(+0x2cfcef)[0x7fe0a43cfcef]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Qml.so.5(_ZN20QQmlComponentPrivate11beginCreateEP15QQmlContextData+0x145)[0x7fe0a43592e5]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Qml.so.5(_ZN13QQmlComponent6createEP11QQmlContext+0x68)[0x7fe0a4359728]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Qml.so.5(_ZN28QQmlApplicationEnginePrivate13_q_finishLoadEP7QObject+0x262)[0x7fe0a43c0de2]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Qml.so.5(_ZN28QQmlApplicationEnginePrivate9startLoadERK4QUrlRK10QByteArrayb+0xd2)[0x7fe0a43c1082]
/opt/Qt/5.5.1/5.5/gcc_64/lib/libQt5Qml.so.5(_ZN21QQmlApplicationEngine4loadERK4QUrl+0x1d)[0x7fe0a43c10bd]
../obj/X64_ATOM/debug/GUI/AucLocalGui2(main+0x84)[0x401ae4]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7fe0a2220b45]
../obj/X64_ATOM/debug/GUI/AucLocalGui2[0x401959]

1 ответов


вот. Вам нужно вытащить зависимость виджетов Qt:

Примечание: начиная с Qt Creator 3.0 проект, созданный с помощью мастера Qt Quick Application wizard на основе шаблона Qt Quick 2, по умолчанию использует QGuiApplication. Поскольку Qt Charts использует Qt Graphics View Framework для рисования, необходимо использовать QApplication. Проект, созданный с помощью мастера, можно использовать с диаграммами Qt после замены QGuiApplication на QApplication.

от http://doc.qt.io/QtCharts/qtcharts-qmlmodule.html

Это согласуется с моим предположением, что проблема находится в теме приложения, которая очень отличается, когда вы используете только приложения QML (QGuiApplication) в отличие от более родных приложений QtWidgets (QApplication).