Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB
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())
 
Virtual hosting with 10 percent discount
Virtual hosting with 10 percent discount
EVILEG offers reliable hosting with a 10% discount for virtual hosting and 5% for VPS
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
AA
April 17, 2019, 7:40 p.m.
Anton Ablin

Qt - Test 001. Signals and slots

  • Result:73points,
  • Rating points1
E
April 17, 2019, 6:16 p.m.
Evgeny

Qt - Test 001. Signals and slots

  • Result:100points,
  • Rating points10
E
April 17, 2019, 6:14 p.m.
Evgeny

Qt - Test 001. Signals and slots

  • Result:78points,
  • Rating points2
Last comments
U
April 18, 2019, 3:37 p.m.
Unreal_man

А как иконку в хедер задать?
u
April 18, 2019, 2:15 a.m.
uaa

доброго времени,большое спасибо за пример для начинающего)при адаптации к своему проекту столкнулся с таким ньансом:в vepolyline.h в 47 строке нужна инициализация по умолчанию: int m_pointF...
E
April 11, 2019, 12:49 p.m.
Evgeny

Спасибо за ответ) У меня компоновщик на нее ругался просто. Оказалось, просто забыл Q_OBJECT в начале класса указать.
April 11, 2019, 12:29 p.m.
Евгений Легоцкой

Добрый день. Вы имели ввиду реализацию? Для сигналов в Qt реализация не пишется, это всё генерируется в moc файлах под капотом Qt.
E
April 11, 2019, 12:15 p.m.
Evgeny

Здравствуйте. А где описание функции signal1()?
Now discuss on the forum
R
April 19, 2019, 9:55 a.m.
RED_Spider

мені важко це зараз навіть перевірити, тому що знайшов коміт, це ще було в 2016 році, і цей код не буде працювати коректно зараз, єдине скажу що це були QThread
i
April 17, 2019, 3:03 p.m.
ilya.guzikov

BlinCT, на стороне ++ это делать необходимо так как в qml при использовании функции append происходит перерисовка всех точек лини(как я понимаю) и из-за этого при использовании больших массиво...
April 10, 2019, 11:20 a.m.
Алексей Внуков

может тоже кому надо будет - QML не принимает QVector<QVector<int>> , при попытке вывести полученый вектор QML показывает что это QVariant(QVector<QVector<int> ...
SN
April 10, 2019, 9:36 a.m.
Stanislav Nykytiuk

Как реализовать такое меню, что бы нажмаешь меню подменю и выбор позиции? Данные меню и подменю в базе SQL.
Join us in social networks

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