Диаграммы QML вызывают сбой при запуске

#python #pyqt5 #qml #qtcharts

Вопрос:

Я пытаюсь создать приложение, которое использует QML QCharts для визуализации данных. Программа выходит из строя при запуске еще до того, как появится окно. Я попробовал как на macOS, так и на Windows 10 с одинаковыми результатами. Ниже я привел минимально рабочий пример.

main.py :

 import sys  from PySide2.QtGui import QGuiApplication from PySide2.QtQml import QQmlApplicationEngine from PySide2.QtCore import QUrl  import qml_rc  if __name__ == "__main__":  app = QGuiApplication(sys.argv)   engine = QQmlApplicationEngine()  engine.load(QUrl("qrc:/main.qml"))   if not engine.rootObjects():  sys.exit(-1)   sys.exit(app.exec_())  

main.qml :

 import QtQuick 2.13 import QtQuick.Controls 2.13 import QtCharts 2.13  ApplicationWindow {  visible: true   // Example taken from: https://doc.qt.io/qt-5/qtcharts-qmlchart-example.html  ChartView {  id: chart  title: "Top-5 car brand shares in Finland"  anchors.fill: parent  legend.alignment: Qt.AlignBottom  antialiasing: true   PieSeries {  id: pieSeries  PieSlice { label: "Volkswagen"; value: 13.5 }  PieSlice { label: "Toyota"; value: 10.9 }  PieSlice { label: "Ford"; value: 8.6 }  PieSlice { label: "Skoda"; value: 8.2 }  PieSlice { label: "Volvo"; value: 6.8 }  }  }   Component.onCompleted: {  // You can also manipulate slices dynamically, like append a slice or set a slice exploded  othersSlice = pieSeries.append("Others", 52.0);  pieSeries.find("Volkswagen").exploded = true;  } }  

Pipfile :

 [[source]] name = "pypi" url = "https://pypi.org/simple" verify_ssl = true  [packages] PySide2 = "==5.13.0"  [requires] python_version = "3.7"  

qml.qrc :

 lt;RCCgt;  lt;qresource prefix="/"gt;  lt;filegt;main.qmllt;/filegt;  lt;/qresourcegt; lt;/RCCgt;  

How I run the program:

 pipenv install -dev pipenv run pyside2-rcc -o qml_rc.py qml.qrc pipenv run python main.py  

If you replace the ChartView object in main.qml with something else (like a Rectangle ), the program will run just fine. I believe there is an issue with the charts.

This is the error message I get: 22432 Segmentation fault: 11 pipenv run python main.py

enter image description here

Here is a partial stacktrace:

 Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 0 QtWidgets 0x000000010a8a79cb QWidgetTextControl::QWidgetTextControl(QObject*)   139 1 QtWidgets 0x000000010a9d2486 0x10a6b3000   3273862 2 QtWidgets 0x000000010a9d2dbd QGraphicsTextItem::document() const   13 3 QtCharts 0x000000010e3e5f56 QtCharts::ChartTitle::ChartTitle(QGraphicsItem*)   54 4 QtCharts 0x000000010e3d98ed QtCharts::ChartPresenter::setTitleFont(QFont constamp;)   61 5 QtCharts 0x000000010e3db0d6 QtCharts::ChartThemeManager::decorateChart(QtCharts::QChart*, QtCharts::ChartTheme*) const   214 6 QtCharts 0x000000010e3dae11 QtCharts::ChartThemeManager::setTheme(QtCharts::QChart::ChartTheme)   337 7 QtCharts 0x000000010e3e0b8e QtCharts::QChart::QChart(QGraphicsItem*, QFlagslt;Qt::WindowTypegt;)   126 8 libqtchartsqml2.dylib 0x000000010e3728fe QtCharts::DeclarativeChart::initChart(QtCharts::QChart::ChartType)   142 9 libqtchartsqml2.dylib 0x000000010e368e50 0x10e34d000   114256 10 QtQml 0x0000000106ff815a QQmlType::create(QObject**, void**, unsigned long) const   90 11 QtQml 0x000000010705c628 QQmlObjectCreator::createInstance(int, QObject*, bool)   568 12 QtQml 0x000000010705e90d QQmlObjectCreator::setPropertyBinding(QQmlPropertyData const*, QV4::CompiledData::Binding const*)   989 13 QtQml 0x000000010705dfcd QQmlObjectCreator::setupBindings(bool)   1485 14 QtQml 0x000000010706290a QQmlObjectCreator::populateInstance(int, QObject*, QObject*, QQmlPropertyData const*)   538 15 QtQml 0x000000010705d2aa QQmlObjectCreator::createInstance(int, QObject*, bool)   3770 16 QtQml 0x000000010705c18b QQmlObjectCreator::create(int, QObject*, QQmlInstantiationInterrupt*)   699 17 QtQml 0x0000000106fe74ec QQmlComponentPrivate::beginCreate(QQmlContextData*)   396 18 QtQml 0x0000000106fe7301 QQmlComponent::create(QQmlContext*)   97 19 QtQml 0x0000000107053ee7 QQmlApplicationEnginePrivate::finishLoad(QQmlComponent*)   87 20 QtQml 0x0000000107054572 QQmlApplicationEngine::load(QUrl constamp;)   34 21 QtQml.abi3.so 0x0000000107bc9c52 Sbk_QQmlApplicationEngineFunc_load(_object*, _object*)   370 22 org.python.python 0x0000000105344696 _PyMethodDef_RawFastCallKeywords   591 23 org.python.python 0x0000000105343bd3 _PyCFunction_FastCallKeywords   44 24 org.python.python 0x00000001053d95f0 call_function   636 25 org.python.python 0x00000001053d2231 _PyEval_EvalFrameDefault   7016 26 org.python.python 0x00000001053d9ef7 _PyEval_EvalCodeWithName   1835 27 org.python.python 0x00000001053d0626 PyEval_EvalCode   51 28 org.python.python 0x00000001053ff2a5 run_mod   54 29 org.python.python 0x00000001053fe2c0 PyRun_FileExFlags   164 30 org.python.python 0x00000001053fd97a PyRun_SimpleFileExFlags   266 31 org.python.python 0x00000001054166a2 pymain_main   5614 32 org.python.python 0x0000000105416ca4 _Py_UnixMain   56 33 libdyld.dylib 0x00007fff6cf023d5 start   1  Thread 1: 0 libsystem_pthread.dylib 0x00007fff6d0f53f0 start_wqthread   0  Thread 2: 0 libsystem_pthread.dylib 0x00007fff6d0f53f0 start_wqthread   0  Thread 3: 0 libsystem_pthread.dylib 0x00007fff6d0f53f0 start_wqthread   0  Thread 4:: QQmlThread 0 libsystem_kernel.dylib 0x00007fff6d03f36e poll   10 1 QtCore 0x0000000106a41810 qt_safe_poll(pollfd*, unsigned int, timespec const*)   608 2 QtCore 0x0000000106a4306a QEventDispatcherUNIX::processEvents(QFlagslt;QEventLoop::ProcessEventsFlaggt;)   858 3 QtCore 0x00000001069e696f QEventLoop::exec(QFlagslt;QEventLoop::ProcessEventsFlaggt;)   431 4 QtCore 0x000000010682230c QThread::exec()   140 5 QtQml 0x0000000107077529 0x106dfa000   2610473 6 QtCore 0x0000000106823283 0x106801000   139907 7 libsystem_pthread.dylib 0x00007fff6d0f62eb _pthread_body   126 8 libsystem_pthread.dylib 0x00007fff6d0f9249 _pthread_start   66 9 libsystem_pthread.dylib 0x00007fff6d0f540d thread_start   13  

Ответ №1:

Для создания Qt-диаграмм требуется QApplication, поскольку, как видно из stacktrace , требуется QChart, для которого требуется QGraphicsItem: QtCharts::QChart::QChart(QGraphicsItem*, QFlagslt;Qt::WindowTypegt;) , поэтому решение состоит в замене QGuiApplication:

 import sys  from PySide2.QtWidgets import QApplication # lt;--- from PySide2.QtQml import QQmlApplicationEngine from PySide2.QtCore import QUrl  import qml_rc  if __name__ == "__main__":  app = QApplication(sys.argv) # lt;---   engine = QQmlApplicationEngine()  engine.load(QUrl("qrc:/main.qml"))   if not engine.rootObjects():  sys.exit(-1)   sys.exit(app.exec_())  

Комментарии:

1. то же самое в версии Qt на C