Форум программистов, компьютерный форум, киберфорум
QML
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
1

Передача указателя на массив в качестве параметра функции в QML

21.02.2016, 18:14. Показов 3945. Ответов 13

Author24 — интернет-сервис помощи студентам
Доброго времени суток.

Имеется следующая система - в Qml приложении есть два элемента: Text{} и Button{}. По нажатию на кнопку в C++ слот посылается целое число. В С++ создаётся массив элементов размера переданного числа и заполняется случайными целыми числами.
После заполнения массив передаётся через сигнал обратно в Qml и нулевой элемент массива выводится в Text{}(чего не происходит и в консоль выдаётся Cannot read property '0' of undefined). В сигнальной функции в качестве параметра используется указатель на массив, но я не уверен как правильно обозначить этот параметр в Connections{}(думаю, что ошибка именно тут).
Вот код:
customClasses.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef CUSTOMCLASSES_H
#define CUSTOMCLASSES_H
#include <QObject>
 
class DataExchange: public QObject
{
    Q_OBJECT
 
public: DataExchange(QObject *parent = 0);
 
signals:
    void sendToQml(int *massive);
 
public slots:
    void receiveFromQml(int mSize);
};
 
#endif // CUSTOMCLASSES_H

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "customclasses.h"
 
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
 
    DataExchange lambda;
    QQmlContext *context = engine.rootContext();
    context->setContextProperty("transitionPoint", &lambda);
 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
 
    return app.exec();
}

dataProcessing.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <QObject>
#include "customclasses.h"
#include <ctime>
 
DataExchange::DataExchange(QObject *parent): QObject(parent){}
 
void DataExchange::receiveFromQml(int dataSize){
    int A[dataSize];
    srand(time(0));
    for(int i=0; i<dataSize; i++){
        A[i] = rand() * (100-1) - 1;
    }
 
    emit sendToQml(A);
}

main.qml
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import QtQuick 2.3
import QtQuick.Controls 1.2
 
ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
 
    Connections{
        target: transitionPoint
        onSendToQml:{
            text1.text = massive[0]
            //dataInsert(massive)
        }
    }
 
    function dataInsert(mas){
        text1.text = mas[0]
        console.log(mas[0])
    }
 
    Text{
        id: text1
 
    }
    Button{
        anchors.top: text1.bottom
        text: "OK"
        onClicked: transitionPoint.receiveFromQml(10)
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.02.2016, 18:14
Ответы с готовыми решениями:

Передача указателя на функцию в качестве параметра
У меня есть много функций с одинаковыми входными параметрами, и мне нужно пропустить их через 1...

Передача параметра из .cpp в .qml
По COM порту получаю строку вида 0,0,999,000000110: , 12 чисел, первые 3 разделяются запятыми,...

Использование функции в качестве параметра
Добрый день! У меня есть класс, каждый раз при создании которого, мы соединяем его со слотом. Для...

Передача указателя на структуру в качестве параметра функции
Здравствуйте. Прошу помощи в довольно простом (для знающих) вопросе. Задумка такая: из функции...

13
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
21.02.2016, 19:44 2
Ты вот тут в типах QML видишь указатель? Вот и я не вижу. Переделывай под то, что есть.
0
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
21.02.2016, 19:48  [ТС] 3
Wyn, а если я передаю прямо в js функцию, в качестве параметра, то типы QML всё равно будут иметь значение?
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
21.02.2016, 19:48 4
Цитата Сообщение от inviter42 Посмотреть сообщение
Wyn, а если я передаю прямо в js функцию, в качестве параметра, то типы QML всё равно будут иметь значение?
А что, в JS есть указатели?
0
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
21.02.2016, 19:50  [ТС] 5
Wyn, в JS есть только ссылки, афаик.

Добавлено через 36 секунд
То есть никак, я правильно понимаю? Как тогда лучше сделать? Записать в строку и передавать строку?
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
21.02.2016, 20:00 6
Цитата Сообщение от inviter42 Посмотреть сообщение
То есть никак, я правильно понимаю? Как тогда лучше сделать? Записать в строку и передавать строку?
http://doc.qt.io/qt-5/qtqml-cp... -data.html
Certain C++ sequence types are supported transparently in QML as JavaScript Array types.
In particular, QML currently supports:
QList<int>
...


Ещё вопросы?
0
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
21.02.2016, 20:05  [ТС] 7
Wyn, да, извините, но я пока что не совсем понял. Если я не передаю в QML указатель на массив, то что я передаю? И как что я это принимаю?
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
21.02.2016, 20:26 8
Лучший ответ Сообщение было отмечено inviter42 как решение

Решение

Цитата Сообщение от inviter42 Посмотреть сообщение
да, извините, но я пока что не совсем понял. Если я не передаю в QML указатель на массив, то что я передаю? И как что я это принимаю?
Следующие две строки из ссылки выше:
There are two ways in which such sequences can be exposed to QML: as a Q_PROPERTY of the given sequence type; or as the return type of a Q_INVOKABLE method.

Как реализовывается обмен данными между c++ и QML:
http://doc.qt.io/qt-5/qtqml-cp... butes.html
Так что, к примеру, можешь передавать свойство(property);
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class DataExchange: public QObject
{
    Q_OBJECT
    Q_PROPERTY(QList<int> output READ output NOTIFY outputChanged)
public: 
    DataExchange(QObject *parent = 0);
 
    QList<int> ouput() { return m_output; } 
    void setOutput(const QList<int> &value) { m_output = value; emit outputChanged(); }
signals:
    void outputChanged();
 
public slots:
    void receiveFromQml(int mSize);
private:
    QList<int> m_output;
};
Добавлено через 2 минуты
И в QML это свойство принимать:
Javascript
1
2
3
4
5
6
7
8
9
10
...
Connections{
        target: transitionPoint
        onOutputChanged:{
            if (transitionPoint.output.length > 0)
                text1.text = transitionPoint.output[0]
            //dataInsert(massive)
        }
    }
...
1
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
22.02.2016, 16:08  [ТС] 9
Wyn, отлично, спасибо. Завтра постараюсь покурить доки и разобраться в этом на свежую голову.

Добавлено через 19 часов 42 минуты
Wyn, я стал разбираться с кодом, который вы написали и у меня появился ещё вопрос - а это нормально, что в макросе Q_PROPERTY не указан аксессор WRITE для метода setOutput?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
class DataExchange: public QObject
{
    Q_OBJECT
    Q_PROPERTY(QList<int> output READ output NOTIFY outputChanged)
public: 
    DataExchange(QObject *parent = 0);
 
    QList<int> ouput() { return m_output; } 
    void setOutput(const QList<int> &value) { m_output = value; emit outputChanged(); }
. . .
};
И, пожалуй, ещё один вопрос, раз уж я начал - в слотовой функции receiveFromQml я создаю массив - как я понял, именно этот массив надо будет записать в кью_пропэртю через setOutput(...), правильно? И если да, то тогда вопрос - массив, создаваемый в receiveFromQml должен сразу быть типа QList <int>?
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
22.02.2016, 17:59 10
Цитата Сообщение от inviter42 Посмотреть сообщение
а это нормально, что в макросе Q_PROPERTY не указан аксессор WRITE для метода setOutput?
Да. Это будет read-only property.
Цитата Сообщение от inviter42 Посмотреть сообщение
И если да, то тогда вопрос - массив, создаваемый в receiveFromQml должен сразу быть типа QList <int>?
Почему сразу? Там может быть всё что угодно. Просто setOutput принимает только QList <int>, следовательно туда вы должны передавать QList <int>. А то, как создан этот QList <int> - дело десятое.
1
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
22.02.2016, 18:13  [ТС] 11
Цитата Сообщение от Wyn Посмотреть сообщение
Почему сразу? Там может быть всё что угодно. Просто setOutput принимает только QList <int>, следовательно туда вы должны передавать QList <int>. А то, как создан этот QList <int> - дело десятое.
То есть мы может преспокойно создать массив типа int в receiveFromQml, преобразовать его в QList <int> и скормить в качестве параметра для setOutput и он его преспокойно проглотит, верно?

Добавлено через 4 минуты
И да, хотелось бы ещё уточнить - при вызове метода setOutput в receiveFromQml он вызывается как обычная функция, только в пространстве имён DataExchange, я правильно понимаю?
То есть что-то такое:
C++ (Qt)
1
DataExchange::setOutput(param)
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
22.02.2016, 19:49 12
Цитата Сообщение от inviter42 Посмотреть сообщение
То есть мы может преспокойно создать массив типа int в receiveFromQml, преобразовать его в QList <int> и скормить в качестве параметра для setOutput и он его преспокойно проглотит, верно?
Конечно.
Цитата Сообщение от inviter42 Посмотреть сообщение
И да, хотелось бы ещё уточнить - при вызове метода setOutput в receiveFromQml он вызывается как обычная функция, только в пространстве имён DataExchange, я правильно понимаю?
То есть что-то такое:
Всмысле? setOutput - это функция-член класса DataExchange. Следовательно и работать с ней надо как с функцией-членом класса. Тк receiveFromQml и setOutput относятся к одному классу, то можно просто вызывать её как обычную функцию -
C++ (Qt)
1
setOutput(param);
P.S. Я может конечно чего-то не понимаю, но если вы не знаете таких очевидных вещей, то вам в qml лезть пока рановато - нужно сначала выучить основы обычного с++.
1
inviter42
22.02.2016, 19:56  [ТС]
  #13

Не по теме:

Цитата Сообщение от Wyn Посмотреть сообщение
Я может конечно чего-то не понимаю, но если вы не знаете таких очевидных вещей, то вам в qml лезть пока рановато - нужно выучить основы обычного с++.
Я бы сказал, что вы правы дважды - вы не знаете какая интересная ситуация у меня сложилась, которая вынуждает меня лезть в qml, не до конца разобравшись с основами C++(что меня, к слову, не радует, потому что я люблю, чтобы всё было разложено по полочкам). И вы правы в том, что мне нужно изучить основы сначала. Но я сильно ограничен во времени, которое у меня есть, чтобы выполнить нужные задания и не могу просто сесть, открыть учебник по С++ и начать его читать и выполнять примеры оттуда. Увы. :(

0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
23.02.2016, 07:50 14
Цитата Сообщение от inviter42 Посмотреть сообщение
Я бы сказал, что вы правы дважды - вы не знаете какая интересная ситуация у меня сложилась, которая вынуждает меня лезть в qml, не до конца разобравшись с основами C++(что меня, к слову, не радует, потому что я люблю, чтобы всё было разложено по полочкам). И вы правы в том, что мне нужно изучить основы сначала. Но я сильно ограничен во времени, которое у меня есть, чтобы выполнить нужные задания и не могу просто сесть, открыть учебник по С++ и начать его читать и выполнять примеры оттуда. Увы.
Понятно. Тогда удачи вам.
0
23.02.2016, 07:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.02.2016, 07:50
Помогаю со студенческими работами здесь

Передача указателя в качестве параметра функции динамически подключаемой библиотеки .so
Собственно возможно ли такое? Ниже мои потуги (пытаюсь передать ссылку на глобальную переменную...

Передача указателя на объект как параметра функции
Доброго времени суток уважаемые форумчане. Я прошу сразу простить меня за быть может не совсем...

Передача функции в качестве параметра
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; double f(double x) { return...

Передача функции в качестве параметра
Есть ф-я для отправки формы аяксом function ajaxFormRequest(form_id, url, dataT, some_func) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru