#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
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