April 3, 2019, 1:02 p.m.

В QML не получается использовать функцию из С++

QML

Добрый день. В QML не получается использовать функцию из С++ Создал класс:

class DataWorking : public QObject
{
public:
    DataWorking();
    ~DataWorking();
    int randomNumber;
    int winNumber;
    int progressNumber;
    int roundNumber;// число раундов

public slots:
    void setRandomNamber(int first, int last);

};
DataWorking::DataWorking()
{
    winNumber = 0;
    progressNumber = 0;
    roundNumber = 20;
}

DataWorking::~DataWorking()
{
    winNumber = 0;
    progressNumber = 0;
}

void DataWorking::setRandomNamber(int first, int last)
{
    randomNumber = Random::get(first, last);
    qDebug()<<"randomNamber = "<<randomNumber;
}

в main.cpp создаю контекст

int main(int argc, char *argv[])
{
    //qDebug()<<Random::get(15, 43);
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    DataWorking dataWorking; //основной объект класса

    QQmlApplicationEngine engine;// Создаём движок qml

    QQmlContext *context = engine.rootContext();    // Создаём корневой контекст
       /* Загружаем объект в контекст для установки соединения,
        * а также определяем имя, по которому будет происходить соединение
        * */
       context->setContextProperty("dataWorking", &dataWorking);

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));// Создаём движок qml
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

в main.qml указываю соединение

   Connections
     {
         target: dataWorking // Указываем целевое соединение

     }

и пытаюсь вызвать функцию класса:

    page1Button0.onClicked: //left button
    {
        dataWorking.setRandomNamber(1,55)
    }

но получаю ошибку: Property 'setRandomNamber' of object QObject(0x22fd40) is not a function Скажите пожалуйста, как можно воспользоваться этой функцией и другими свойствами?

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.
4

Приветствую. Чтобы использовать методы или свойства из С++ надо юзать Q_INVOCABLE и Q_PROPERTY И тогда QML сможет их юзать.

0

Скажите пожалуйста, как это сделать. Попробовал сделать так, компилируется, но не заработало, видимо сделал неправильно:

class DataWorking : public QObject
{
public:
    DataWorking();
    ~DataWorking();
    int randomNumber;
    Q_PROPERTY(int randomNumber MEMBER m_randomNumber)
    int winNumber;
    int progressNumber;
    int roundNumber;// число раундов

public slots:
    void setRandomNamber(int first, int last);
    Q_PROPERTY(void setRandomNamber READ setRandomNamber WRITE setSetRandomNamber NOTIFY setRandomNamberChanged)

};

Таккже попробовал сделать через Q_INVOCABLE , и тоже не работает

class DataWorking : public QObject
{
public:
    DataWorking();
    ~DataWorking();
    Q_INVOKABLE  int randomNumber;
    int winNumber;
    int progressNumber;
    int roundNumber;// число раундов

public slots:
    Q_INVOKABLE  void setRandomNamber(int first, int last);

};
0

в хедере пишем

class A : public QObject
{
    Q_OBJECT
public:
    Q_INVOKABLE void foo();
}

main.cpp

#include <a.h>
....

A *_a=new A();
engine.rootContext()->setContextProperty("A",_a);
.......

В QML

.........
A.foo()
.......
0

Спасибо. Оказалось достаточно Q_OBJECT добавить и использовать Q_INVOKABLE

0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Last comments
June 24, 2019, 10:23 a.m.
Евгений Легоцкой

Хорошо, ну будут проблемы помимо того, что касается статей, то не стесняйтесь задавать вопросы на форуме.
МБ
June 24, 2019, 10:21 a.m.
Михаил Булатов

Извиняюсь, все работает(из-за невнимательности).
June 24, 2019, 9:52 a.m.
Евгений Легоцкой

Придётся делать ещё сигнал в дочернем qml и пробрасывать через коннекты и обработчики. А вообще нужно смотреть конкретный код и что вы пытаетесь сделать. Так что лучше будет, если вы зад...
June 21, 2019, 8:31 a.m.
Ruslan Polupan

Вот моя строка по которой все отлично сработало %cqtdeployer% -bin c:/CentralMposKeys/CentalMposKeys.exe -qmake c:/Qt/5.12.2/mingw73_64/bin/qmake.exe
June 21, 2019, 8:24 a.m.
Андрей Янкович

Возможно кому то пригодится сqtdeployer для windows работает точно так же как и для Linux разница лишь в команде запуска Linux: cqtdeployer Windows: %cqtdeployer...
Now discuss on the forum
June 24, 2019, 2:36 p.m.
Михаиллл

Нашел проект подключения к вебсокету.Но по моему адресу не могу подключиться.Нужно ли для этого использовать библиотеки?Вы не знаете адрес вебсокета, на котором можно проверить с...
June 24, 2019, 2:07 p.m.
Евгений Легоцкой

Я пока даже не знаю, а какой код самого подключения? использовали ожидание на подключение? Так делали? socket->connectToServer("market");if (socket->waitForConnected(1000)) ...
June 24, 2019, 1:19 p.m.
IscanderChe

// widget.cpp#include "widget.h"#include <QTableView>#include <QVBoxLayout>#include "checkboxdelegate.h"#include "comboboxdelegate.h"#include "mytableview.h"#include <QSqlD...
June 24, 2019, 11:16 a.m.
BlinCT

Хорошо, с этим понятно. Вот есть такой набор каких то кнопок. Цифры отображают в каком порядке должен менятся фокус.1. Как правильнее сделать отображение активного обьекта...
e
June 24, 2019, 10:58 a.m.
evgenm27

Спасибо за ответ, буду пробовать
Looking for a Job?
10,000.00 руб. - 15,000.00 руб.
Нужен помощник для создания API.
Moscow, Moscow, Russia
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