Aug. 29, 2017, 6: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())
 
10% refund of hotel reservation amount on Booking
10% refund of hotel reservation amount on Booking
We offer a link with a 10% return on the amount of the order when booking a hotel through Booking
7

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

0
  • Aug. 30, 2017, 7:51 a.m.

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

1

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

0
  • Aug. 30, 2017, 11: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)
    }

 

2

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

1

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

0

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

QVector<QVector<int>>

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

QVariant(QVector<QVector<int> >)

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

0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
TT
June 13, 2019, 7:01 p.m.
Taimoor Tanweer

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

  • Result:66points,
  • Rating points-1
TT
June 13, 2019, 6:51 p.m.
Taimoor Tanweer

C++ - Test 002. Constants

  • Result:75points,
  • Rating points2
ВМ
June 13, 2019, 12:30 p.m.
Ваня Мороз

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

  • Result:100points,
  • Rating points10
Last comments
МБ
June 20, 2019, 6:23 p.m.
Михаил Булатов

А если мне нужно сделать конект из дочернего qml?Сигнал работает только из main.qml
i
June 17, 2019, 6:10 a.m.
ingenfly

Только по осям xAxis2, уAxis2 значения начинаются с 0. Почему-то xAxis2 и xAxis не синхронизированы по данным. Ну и QCustomPlot последний.
June 16, 2019, 8:21 p.m.
Евгений Легоцкой

Добрый день. Ну точно также добавляете ту же самую информацию на ось xAxis2, только добавляете другое форматирование customPlot->xAxis2->setDateTimeFormat("hh:mm"); если я ...
EF
June 14, 2019, 1:56 p.m.
Egor Fomin

Спасибо за ваш ответ, у меня получилось реализовать это. Тем не менее появилась другая проблема, поэтому опять надеюсь на вашу помощь. Скажем, я уже выставил точки и они соеденены. Когда я нач...
d
June 13, 2019, 2:47 p.m.
damix

Можно классу, который описывает точку, добавить сигнал, который подавать (emit), когда точка перемещается (переопределить mouseMoveEvent или mouseReleaseEvent). Так вот эти сигналы у каждой из...
Now discuss on the forum
June 20, 2019, 9:30 a.m.
IscanderChe

Вернулся к этой задачке только-только, поэтому и не ответил ничего раньше.Как переопределить mouseReleaseEvent(QMouseEvent* event) у QTableView, если QTableView задан в ui? Или задавать QTabl...
I
June 19, 2019, 1:41 p.m.
Intruder

Всем добрый день. При разборе XML файла наткнулся на тег вот такого плана: <TagName attribute1="value1" attribute2="value2" /> При попытке проверить на наличие такого элеме...
June 19, 2019, 12:55 p.m.
Михаиллл

Скажите пожалуйста, как его в таком случае перемещать и удалять?
June 18, 2019, 7:50 p.m.
Дмитрий

Большое спасибо! SDK заработал.К сожалению удалось продвинутся только на один шаг. При сборке чистого проекта NDK выдаёт следующие ошибки C:\Android\ndk-bundle/toolchains/arm-linux-andr...
June 18, 2019, 4:59 p.m.
Михаиллл

Добрый день.В этом учебнике представлен код INSTALLED_APPS = ( ... 'rest_framework', 'snippets.apps.SnippetsConfig',) На строчке 'snippets.apps.SnippetsConf...
Looking for a Job?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

EVILEG
About
Services
Join us
© EVILEG 2015-2019
Recommend hosting TIMEWEB