Aug. 29, 2017, 2:49 p.m.

Как передать из C++ в Qml массив структур.

Доброго времени суток, подскажите пожалуйста как из C++ части в Qml передать массив структур. К примеру есть структура

 
struct TankShell
{
    int position_1;
    int position_2;
    int direction;
    int speed;
};
Есть класс, не привожу весь, через свойства я хочу передавать массив структур:
class bcGame : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QVector<TankShell> m_shellsArr READ getShellsCoords NOTIFY sigShellsMove)
Графическая часть:
 GameObj
 {
        id: gm
 }
    
function drawNewShellsPosition(data)
    {
        console.log(gm.getShellsCoords())
    }
Выдаётся ошибка:
qrc:/qml/main.qml:234: Error: Unknown method return type: QVector<TankShell>

из этой строки

 console.log(gm.getShellsCoords())
 
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
7

Хороший вопрос. У самого руки не доходят разобраться с ним, хотя уже поджимает решить этот вопрос. По идее просто структуру передать не получится... А вот если это будет класс наследованный от QObject и зарегистрированный в качестве Qml Meta Type, то должно сработать. Правда сам ещё не проверял, надо будет на днях поколупать.

  • Aug. 30, 2017, 3:51 a.m.

Понял вас, ищу решение данного вопроса, если решу раньше вас то выложу.

Да. Ещё один момент, все поля класса, к которым вы захотите иметь доступ должны быть обработаны макросом Q_PROPERTY

  • Aug. 30, 2017, 7:50 a.m.

В общем нашёл выход, не знаю насколько правильный, но он работает. Если у вас получится по другому то напишите потом пожалуйста.

 
Проблема была в том что не получалось обработать массив своих структур, но Qml умеет работать с QVector<int>, поэтому было решено в классе сделать методы которые из массива выбирали по полю, и потом через сигнал идёт генерация 4 массивов QVector<int> и  их дальнейшая обработка.  Привожу код:
СТРУКТУРА:
struct TankShell
{
    int position_1;
    int position_2;
    int direction;
    int speed;
};

МЕТОДЫ И СИГНАЛ КЛАССА

 public:
    QVector<int> getPosition_1();
    QVector<int> getPosition_2();
    QVector<int> getShellsDirections();
    QVector<int> getShellsSpeed();
signals:
    void sigUpdateShellsPositions(QVector<int> pos_1_data, QVector<int> pos_2_data, QVector<int> _direction, QVector<int> _speed);
Генерируем сигнал когда нам нужно, используем функции для его заполнения:
emit sigUpdateShellsPositions(getPosition_1(), getPosition_2(), getShellsDirections(), getShellsSpeed());

 

И в самом Qml ловим этот сигнал и обрабатываем:

 Connections {
        target: cppObject
        onSigUpdateShellsPositions: drawNewShellsPosition(pos_1_data, pos_2_data, _direction, _speed)
}

    function drawNewShellsPosition(p1, p2, dir, sp)
    {
        console.log(p1, p2, dir, sp)
    }

 

Взял на заметку! Спасибо за решение!

Там есть звёздочка. Можете добавить в избранное, чтобы было в личном кабинете сайта.

может тоже кому надо будет - QML не принимает

QVector<QVector<int>>

, при попытке вывести полученый вектор QML показывает что это

QVariant(QVector<QVector<int> >)

но работать с ним не может. Тоже решал вопрос по примеру ТС - через несколько простых векторов

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Donate

Hello, Dear Users of EVILEG!!!

If the site helped you, then support the development of the site financially, please.

You can do it by following ways:

Thank you, Evgenii Legotckoi

SB
Dec. 5, 2019, 8:01 a.m.
Sergej Bederin

C++ - Test 001. The first program and data types

  • Result:60points,
  • Rating points-1
AS
Dec. 4, 2019, 6:39 a.m.
Artur Salmin

C++ - Test 005. Structures and Classes

  • Result:33points,
  • Rating points-10
ST
Dec. 2, 2019, 4:05 p.m.
Sergej Timchenko

Qt - Test 001. Signals and slots

  • Result:68points,
  • Rating points-1
Last comments
Dec. 5, 2019, 4:15 p.m.
Evgenij Legotskoj

В этом слоте ваам нужно будет правильно смаппить координату. У QGraphicsView есть методы mapToScene, mapFromScene. Попробуйте использовать их.
LP
Dec. 5, 2019, 8:30 a.m.
Leonid Pivovarov

А без переопределения qgraphicsScene это сделать возможно? Есть же коорината нажатия кнопки мыши slotCustomMenuRequested(QPoint)
Dec. 5, 2019, 8:11 a.m.
Mihailll

//qDebug()<<"position:"<<event->pos(); //qDebug()<<"position:"<<event->screenPos(); qDebug()<<"position:"<<event->scenePos();
LP
Dec. 5, 2019, 8:09 a.m.
Leonid Pivovarov

Подскажите пожалуйста, К graphicsView я подключил обработку контекстного меню: сonnect(ui->graphicsView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotCustomMenuRequest…
Dec. 4, 2019, 3:49 p.m.
Evgenij Legotskoj

resources_big - это флаг для сборки c++ приложения. Если Nuitka не предоставляет какой-либо функционал для прикручивания конфигурационных директив типа CONFIG при компиляции, то сомнева…
Now discuss on the forum
Dec. 5, 2019, 4:12 p.m.
Evgenij Legotskoj

Это уже кастомная стилизация. Придётся отключать обрамление и самостоятельно реализовывать ресайз окна, его перемещение, стиль и т.д. Вот статья, как отключить обрамление окна - QML …
Dec. 5, 2019, 4:27 a.m.
qml_puthon_user

Вот код, вдруг, кому поможет. Код основной формы: import QtQuick 2.12import QtQuick.Controls 2.12import QtQuick.Layouts 1.3import "./Components/Panels" as PanelsApplicationWindow{…
Dec. 5, 2019, 2:50 a.m.
Evgenij Legotskoj

Создавайте новые темы, чтобы не было всё в куче.
Dec. 4, 2019, 10:07 p.m.
qml_puthon_user

Спасибо за помощь! :) Я попытаю надежды в ожидании QtQuick3D от Riverbank'a. :)
V
Dec. 4, 2019, 7:02 a.m.
Vitali

Со временем распаковки соласен - для слабых ноутов это проблема и именно Nuitka мог бы здесь помочь, если бы заработало. А QtlFW - это уже фреймфорк для создания инсталятора из имеющихся па…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB