LINUX.ORG.RU

[Решено] QtCharts в QML

 , ,


0

1

Доброго всем времени суток.

Пытаюсь на qml нарисовать какой-нить график (Qt5.12.8, хотя на Qt6.2.3 поведение такое же). Сборка через cmake, в CMaleLists.txt добавил следующие строки

find_package(Qt5Charts)
target_link_libraries(testCharts
  PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::Charts)
вот qml-файл
import QtQuick 2.12
import QtQuick.Window 2.12
import QtCharts 2.3

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")


    ChartView {
        title: "Spline"
        anchors.fill: parent
        antialiasing: true

        SplineSeries {
            name: "SplineSeries"
            XYPoint { x: 0; y: 0.0 }
            XYPoint { x: 1.1; y: 3.2 }
            XYPoint { x: 1.9; y: 2.4 }
            XYPoint { x: 2.1; y: 2.1 }
            XYPoint { x: 2.9; y: 2.6 }
            XYPoint { x: 3.4; y: 2.3 }
            XYPoint { x: 4.1; y: 3.1 }
        }
    }
}

Однако, после запуска программа сразу падает. Вроде даже при установке qt указал, ткнул на gpl3 и согласился, но всё-ровно не работает. Подскажите как запустить сей велосипед



Последнее исправление: seijuurou (всего исправлений: 3)

Для дебага советую qmlscene, мб что-то полезное скажет.

l4gfcm ★★
()
Ответ на: комментарий от EXL

О, привет. В свое время твои комментарии надоумили меня изучить qml, за что выражаю личную благодарность и уважение.

Но hmi надоел так, что на серьезный проект делать графику не решился и ушел в бэк.

Все это, конечно же оффтоп.

l4gfcm ★★
()
Ответ на: комментарий от EXL

Интересно, откуда там ошибка сегментирования вроде ж просто тестовую простую программу собираю

abakumovag@abakumovPC:~/src/testCharts/build/Desktop_Qt_5_12_8_Clang_64bit-Debug\> ls
build.ninja          CMakeFiles           rules.ninja         Testing
CMakeCache.txt       cmake_install.cmake  testCharts
CMakeCache.txt.prev  qtcsettings.cmake    testCharts_autogen
abakumovag@abakumovPC:~/src/testCharts/build/Desktop_Qt_5_12_8_Clang_64bit-Debug\> ./testCharts
QML debugging is enabled. Only use this in a safe environment.
Ошибка сегментирования (стек памяти сброшен на диск)

seijuurou
() автор топика
Ответ на: комментарий от l4gfcm

В свое время твои комментарии надоумили меня изучить qml, за что выражаю личную благодарность и уважение.

Это странно, ведь обычно за советы по изучению QtQuick/QML потом выражают личную неприязнь и сыпят проклятьями :D

EXL ★★★★★
()
Ответ на: комментарий от EXL
gdb ./testCharts
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./testCharts...
(gdb) run
Starting program: /home/abakumovag/src/testCharts/build/Desktop_Qt_5_12_8_Clang_64bit-Debug/testCharts 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
QML debugging is enabled. Only use this in a safe environment.
[New Thread 0x7ffff09b1700 (LWP 361468)]
[New Thread 0x7fffeaaea700 (LWP 361469)]
[New Thread 0x7fffea2e9700 (LWP 361470)]
[New Thread 0x7fffe9715700 (LWP 361474)]
[New Thread 0x7fffe8f14700 (LWP 361476)]

Thread 1 "testCharts" received signal SIGSEGV, Segmentation fault.
0x00007ffff6606fc5 in QWidgetTextControl::setCursorWidth (this=<optimized out>, width=width@entry=-1) at widgets/qwidgettextcontrol.cpp:2409
2409	widgets/qwidgettextcontrol.cpp: Нет такого файла или каталога.
(gdb) backtrace
#0  0x00007ffff6606fc5 in QWidgetTextControl::setCursorWidth (this=<optimized out>, width=width@entry=-1) at widgets/qwidgettextcontrol.cpp:2409
#1  0x00007ffff660701a in QWidgetTextControlPrivate::init (this=<optimized out>, format=format@entry=Qt::RichText, text=..., document=document@entry=0x0)
    at widgets/qwidgettextcontrol.cpp:427
#2  0x00007ffff6607082 in QWidgetTextControl::QWidgetTextControl (this=0xcd75a0, parent=0x472ee0) at widgets/qwidgettextcontrol.cpp:869
#3  0x00007ffff6702d67 in QGraphicsTextItemPrivate::textControl (this=0x42db30) at graphicsview/qgraphicsitem.cpp:10594
#4  0x00007ffff670305d in QGraphicsTextItem::document (this=this@entry=0x472ee0) at graphicsview/qgraphicsitem.cpp:10260
#5  0x00007ffff7620fe4 in QtCharts::ChartTitle::ChartTitle (this=0x472ee0, parent=<optimized out>) at charttitle.cpp:42
#6  0x00007ffff7613b44 in QtCharts::ChartPresenter::createTitleItem (this=0x7fea20) at chartpresenter.cpp:266
#7  0x00007ffff7613dd1 in QtCharts::ChartPresenter::setTitleFont (this=0x7fea20, font=...) at chartpresenter.cpp:363
#8  0x00007ffff761c4cd in QtCharts::QChart::setTitleFont (this=this@entry=0x55d230, font=...) at qchart.cpp:356
#9  0x00007ffff7617323 in QtCharts::ChartThemeManager::decorateChart (this=this@entry=0x539190, chart=0x55d230, theme=0x688320) at chartthememanager.cpp:105
#10 0x00007ffff76185f9 in QtCharts::ChartThemeManager::setTheme (this=0x539190, theme=theme@entry=QtCharts::QChart::ChartThemeLight) at chartthememanager.cpp:84
#11 0x00007ffff761c52d in QtCharts::QChart::setTheme (this=<optimized out>, theme=theme@entry=QtCharts::QChart::ChartThemeLight) at qchart.cpp:385
#12 0x00007ffff761d06f in QtCharts::QChartPrivate::init (this=0x513eb0) at qchart.cpp:898
#13 0x00007fffdb5b6aaf in QtCharts::DeclarativeChart::initChart (this=0x699490, type=<optimized out>) at declarativechart.cpp:479
#14 0x00007fffdb598300 in QQmlPrivate::QQmlElement<QtCharts::DeclarativeChart>::QQmlElement (this=0x699490) at /home/qt/work/install/include/QtQml/qqmlprivate.h:103
#15 QQmlPrivate::createInto<QtCharts::DeclarativeChart> (memory=0x699490) at /home/qt/work/install/include/QtQml/qqmlprivate.h:124
#16 0x00007ffff7159bf3 in QQmlType::create (this=this@entry=0x7fffffffcdd0, out=out@entry=0x7fffffffcde8, memory=memory@entry=0x7fffffffce00, 
    additionalMemory=additionalMemory@entry=144) at qml/qqmlmetatype.cpp:1043
#17 0x00007ffff71bd0ee in QQmlObjectCreator::createInstance (this=this@entry=0x525440, index=3, parent=0x67fae0, isContextObject=isContextObject@entry=false)
    at qml/qqmlobjectcreator.cpp:1165
#18 0x00007ffff71bf620 in QQmlObjectCreator::setPropertyBinding (this=this@entry=0x525440, bindingProperty=0x7fffd4073ad8, binding=binding@entry=0x7fffe9a7d848)
    at qml/qqmlobjectcreator.cpp:825
#19 0x00007ffff71bfece in QQmlObjectCreator::setupBindings (this=this@entry=0x525440, applyDeferredBindings=applyDeferredBindings@entry=false)
    at qml/qqmlobjectcreator.cpp:777
#20 0x00007ffff71bc946 in QQmlObjectCreator::populateInstance (this=this@entry=0x525440, index=0, index@entry=1, instance=0x702600, bindingTarget=0x702600, 
    valueTypeProperty=valueTypeProperty@entry=0x0) at qml/qqmlobjectcreator.cpp:1469
#21 0x00007ffff71bd38d in QQmlObjectCreator::createInstance (this=this@entry=0x525440, index=<optimized out>, parent=<optimized out>, 
    isContextObject=isContextObject@entry=false) at qml/qqmlobjectcreator.cpp:1306
#22 0x00007ffff71bf620 in QQmlObjectCreator::setPropertyBinding (this=this@entry=0x525440, bindingProperty=0x7fffd40448f8, binding=binding@entry=0x7fffe9a7d7e8)
    at qml/qqmlobjectcreator.cpp:825
#23 0x00007ffff71bfece in QQmlObjectCreator::setupBindings (this=this@entry=0x525440, applyDeferredBindings=applyDeferredBindings@entry=false)
--Type <RET> for more, q to quit, c to continue without paging--RET
   777
#24 0x00007ffff71bc946 in QQmlObjectCreator::populateInstance (this=this@entry=0x525440, index=-1, index@entry=0, instance=0x0, bindingTarget=0x0, valueTypeProperty=valueTypeProperty@entry=0x0)
    at qml/qqmlobjectcreator.cpp:1469
#25 0x00007ffff71bd38d in QQmlObjectCreator::createInstance (this=this@entry=0x525440, index=index@entry=0, parent=parent@entry=0x0, isContextObject=isContextObject@entry=true)
    at qml/qqmlobjectcreator.cpp:1306
#26 0x00007ffff71c08de in QQmlObjectCreator::create (this=0x525440, subComponentIndex=<optimized out>, parent=parent@entry=0x0, interrupt=interrupt@entry=0x0) at qml/qqmlobjectcreator.cpp:203
#27 0x00007ffff7143e7b in QQmlComponentPrivate::beginCreate (this=0x500630, context=<optimized out>) at qml/qqmlcomponent.cpp:883
#28 0x00007ffff7141999 in QQmlComponent::create (this=0x705cf0, context=0x6fac00) at qml/qqmlcomponent.cpp:795
#29 0x00007ffff71b090b in QQmlApplicationEnginePrivate::finishLoad (this=this@entry=0x54eda0, c=c@entry=0x705cf0) at qml/qqmlapplicationengine.cpp:136
#30 0x00007ffff71b0b8e in QQmlApplicationEnginePrivate::startLoad (this=0x54eda0, url=..., data=..., dataFlag=dataFlag@entry=false) at qml/qqmlapplicationengine.cpp:120
#31 0x00007ffff71b0bbd in QQmlApplicationEngine::load (this=<optimized out>, url=...) at qml/qqmlapplicationengine.cpp:266
#32 0x0000000000401421 in main (argc=1, argv=0x7fffffffdd38) at ../../main.cpp:19
seijuurou
() автор топика
Ответ на: комментарий от seijuurou

Вот здесь попробуй предложенное решение:

https://bugreports.qt.io/browse/QTBUG-53544

https://stackoverflow.com/a/34198644

В общем случае, если у тебя QGuiApplication в main.cpp, переключись на использование QApplication класса.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 2)
Ответ на: комментарий от EXL

Забавно, буквально на днях при портировании на Qt6 большого приложения пришлось наоборот поменять QApplication на QGuiApplication из-за сегфолта. Правда, charts там уже больше не используются.

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

Вообще я думаю зря они разделение на QApplication, QGuiApplication и QCoreApplication делали раньше. Похоже что больше недостатков принесло, чем удобства. Хотя может в Embedded было оправдано.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Там ЕМНИП чарты нифига не КуМэЭл ные. Им было влом реализовывать их как надо. Под капотом там те же виджеты, которые просто отрисовываются растровым пайнтером. Поэтому нужен QApp а не QGuiApp. И ни о какой производительности речи не идет. Так, просто по формошлепить по быстрому.

kuzulis ★★
()
Последнее исправление: kuzulis (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.