© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
18 мая 2018 г. 8:11

Сборщик мусора и Connections в qml

Qt5, QML C++

подключил в qml c++ класс


main.cpp
int main(int argc, char *argv[])
{

    QList<QPair<QString,qreal>> ArrowList;
    QList<QString> IndicatorList;
    fillDataToPanel(ArrowList,IndicatorList);

    PanelModel panel;
    panel.setFillData(ArrowList,IndicatorList);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    QQmlContext *context = engine.rootContext();
    engine.setObjectOwnership(&panel,engine.JavaScriptOwnership);
    context->setContextProperty("panel",&panel);
    qmlRegisterType<Arrow>();
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}
часть qml
main.qml
import QtQuick 2.3
import QtQuick.Window 2.2


Window {

    visible: true
    width: 1280
    height: 720
    opacity: 1
    color: "black"

    flags: Qt.FramelessWindowHint

    Connections{
        target: panel
        onContainerChanged:{
            image2.rotation=arg.getArrowMapDisplayValue("MainArrow").value


        }

    }

    MouseArea{
        anchors.rightMargin: 468
        anchors.bottomMargin: 163
        anchors.leftMargin: 476
        anchors.topMargin: 243
        anchors.fill: parent
        onClicked:{
            panel.moveMainArrow()
            gc()
        }


    }




    Item {
        id: background
        x: -692
        y: -217
        width: 1280
        height: 720
        opacity: 1
        anchors.centerIn: parent

        Image {
            id: image1
            x: 0
            y: 0
            width: parent.width
            height: parent.height
            opacity: 1
            fillMode: Image.Stretch
            source: "../kr.png"

        }
        Image {
            id: image2
            x: 320
            y: 80
            width: 639
            height: 639
            source: "../row.png"
        }
после первого клика запускается таймер который соединяет сигнал с++ со слотом qml. После второго клика сборщик мусора удаляет элемент Connections и появляется ошибка
TypeError: Cannot read property 'value' of null.
Версия qt 5.5

Думаю, что по какой-то причине сборщик мусора считает, что panel нигде не используется, хотя видимых причин в коде нет, кроме разве что того, что вы использовали установку владения объектом panel на QML часть

engine.setObjectOwnership(&panel,engine.JavaScriptOwnership);
Если права владения переходят в QML, то сборщик мусора уже решает, что и как делать с объектом, но здесь какое-то странное поведение, поскольку явного удаления объекта panel я не вижу.

Попробуйте удалить эту строку с установкой прав владения.

Подобную проблему с правами владения я рассматривал в этой статье.

Для Django рекомендую VDS-хостинг TIMEWEB

можешь попробовать в деструкторе модели вызвать

throw;
и в дебагере посмотреть stacktrace

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
24 сентября 2018 г. 17:42
edorofeeva

C++ - Тест 001. Первая программа и типы данных

  • Результат 100баллов,
  • Очки рейтинга10
24 сентября 2018 г. 17:37
edorofeeva

C++ - Тест 001. Первая программа и типы данных

  • Результат 66баллов,
  • Очки рейтинга-1
23 сентября 2018 г. 14:38
No Names

C++ - Тест 001. Первая программа и типы данных

  • Результат 60баллов,
  • Очки рейтинга-1
Последние комментарии
25 сентября 2018 г. 15:24
pasagir

Qt/C++ - Урок 006. QSqlQueryModel - Таблицы в Qt с помощью SQL-запросов

Это запись метода которая работает параллельно с БД, данные из парсера поступают в БД и в наш метод одновременно
25 сентября 2018 г. 14:56
pasagir

Qt/C++ - Урок 006. QSqlQueryModel - Таблицы в Qt с помощью SQL-запросов

Как можно динамически отображать данные в таблице? На COM-порт непрерывно приходят данные, я их принимаю сохраняю в БД, а после остановка приема/передачи данные отображаются в таблице. В табли...
25 сентября 2018 г. 10:43
Евгений Легоцкой

Qt/C++ - Урок 017. QGraphicsScene или как работать с графикой в Qt

Прямо так не написано. Хотя соглашусь, что в качестве улучшения вызов данного метода здесь к месту.
25 сентября 2018 г. 10:37
reef425

Qt/C++ - Урок 017. QGraphicsScene или как работать с графикой в Qt

В статье написано, что таймер сработает один раз. Но это не так. Было бы хорошо добавить timer->setSingleShot(true); После инициализации таймера.
24 сентября 2018 г. 15:09
Евгений Легоцкой

Qt Linux - Урок 001. Автозапуск Qt приложения под Linux

А вот здесь у меня есть пример использования supervisor. https://evileg.com/ru/post/3/ Вся статья вам там не интересна, интересен только шаг с настройкой supervisor. Он получается ...
Сейчас обсуждают на форуме
25 сентября 2018 г. 15:57
Евгений_Канусовский@1981

Чтение файлов в python

Вот код: import sys from re import matchfrom vira import *from PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtWidgets import (QDialog, QFileDialog, QMessageBox, QLineEdit, QProgr...
25 сентября 2018 г. 13:51
DmitrySD

Трансляция видео с помощью VLC по RTP

Спасибо! Данная команда не дала результата. В итоге сделал трансляцию через ffmpeg. ffmpeg.exe -f gdigrab -framerate 30 -i desktop -vcodec libx264 -preset:v veryfast -b:v 4000k -f...
25 сентября 2018 г. 13:39
Arrow

Настройка Qt Creator для Android

Конечно отпишусь.
25 сентября 2018 г. 12:22
avovana

Автозапуск и авторестарт Qt Gui Application в Linux

Не получается... Решил пробовать скрипт, выполняемый при загрузке. В скрипте вечный цикл по старту программы.
Присоединяйтесь к нам в социальных сетях