Михаиллл
3 апреля 2019 г. 19:02

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

QML

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

  1. class DataWorking : public QObject
  2. {
  3. public:
  4. DataWorking();
  5. ~DataWorking();
  6. int randomNumber;
  7. int winNumber;
  8. int progressNumber;
  9. int roundNumber;// число раундов
  10.  
  11. public slots:
  12. void setRandomNamber(int first, int last);
  13.  
  14. };
  1. DataWorking::DataWorking()
  2. {
  3. winNumber = 0;
  4. progressNumber = 0;
  5. roundNumber = 20;
  6. }
  7.  
  8. DataWorking::~DataWorking()
  9. {
  10. winNumber = 0;
  11. progressNumber = 0;
  12. }
  13.  
  14. void DataWorking::setRandomNamber(int first, int last)
  15. {
  16. randomNumber = Random::get(first, last);
  17. qDebug()<<"randomNamber = "<<randomNumber;
  18. }

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

  1. int main(int argc, char *argv[])
  2. {
  3. //qDebug()<<Random::get(15, 43);
  4. QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
  5.  
  6. QGuiApplication app(argc, argv);
  7.  
  8. DataWorking dataWorking; //основной объект класса
  9.  
  10. QQmlApplicationEngine engine;// Создаём движок qml
  11.  
  12. QQmlContext *context = engine.rootContext(); // Создаём корневой контекст
  13. /* Загружаем объект в контекст для установки соединения,
  14. * а также определяем имя, по которому будет происходить соединение
  15. * */
  16. context->setContextProperty("dataWorking", &dataWorking);
  17.  
  18. engine.load(QUrl(QStringLiteral("qrc:/main.qml")));// Создаём движок qml
  19. if (engine.rootObjects().isEmpty())
  20. return -1;
  21.  
  22. return app.exec();
  23. }

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

  1. Connections
  2. {
  3. target: dataWorking // Указываем целевое соединение
  4.  
  5. }

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

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

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

3
Вопрос задан по статьеQML - Урок 004. Сигналы и слоты в Qt QML

Вам это нравится? Поделитесь в социальных сетях!

4
BlinCT
  • 3 апреля 2019 г. 20:47

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

    Михаиллл
    • 3 апреля 2019 г. 21:25
    • (ред.)

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

    1. class DataWorking : public QObject
    2. {
    3. public:
    4. DataWorking();
    5. ~DataWorking();
    6. int randomNumber;
    7. Q_PROPERTY(int randomNumber MEMBER m_randomNumber)
    8. int winNumber;
    9. int progressNumber;
    10. int roundNumber;// число раундов
    11.  
    12. public slots:
    13. void setRandomNamber(int first, int last);
    14. Q_PROPERTY(void setRandomNamber READ setRandomNamber WRITE setSetRandomNamber NOTIFY setRandomNamberChanged)
    15.  
    16. };

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

    1. class DataWorking : public QObject
    2. {
    3. public:
    4. DataWorking();
    5. ~DataWorking();
    6. Q_INVOKABLE int randomNumber;
    7. int winNumber;
    8. int progressNumber;
    9. int roundNumber;// число раундов
    10.  
    11. public slots:
    12. Q_INVOKABLE void setRandomNamber(int first, int last);
    13.  
    14. };
      Алексей Внуков
      • 4 апреля 2019 г. 14:38
      • (ред.)
      • Ответ был помечен как решение.

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

      1. class A : public QObject
      2. {
      3. Q_OBJECT
      4. public:
      5. Q_INVOKABLE void foo();
      6. }

      main.cpp

      1. #include <a.h>
      2. ....
      3.  
      4. A *_a=new A();
      5. engine.rootContext()->setContextProperty("A",_a);
      6. .......

      В QML

      1. .........
      2. A.foo()
      3. .......
        Михаиллл
        • 4 апреля 2019 г. 16:14

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

          Комментарии

          Только авторизованные пользователи могут публиковать комментарии.
          Пожалуйста, авторизуйтесь или зарегистрируйтесь
          • Последние комментарии
          • IscanderChe
            12 апреля 2025 г. 17:12
            Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
          • AK
            1 апреля 2025 г. 11:41
            Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
          • Evgenii Legotckoi
            9 марта 2025 г. 21:02
            К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
          • VP
            9 марта 2025 г. 16:14
            Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
          • ИМ
            22 ноября 2024 г. 21:51
            Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…