BlinCT
BlinCT29 липня 2019 р. 08:41

Врапер для класса и работа с мета обьектами

qt5

Всем привет.
Вопрос о возможности подобной реализации:
Есть класс worker(внутри есть проперти, сигналы и т.д.), он работает в отдельном потоке.
Есть класс wrapper, он должен считать все проперти из класса worker и передать данные тому кто будет данные юзать. Например аппликация с quick2.
То есть вся работа проходит через данный врапер.
Если у кого есть подобный пример или можете написать примерно как это должно работать, буду очень признателен.
Но как я понимаю это связано с dinamic properties, и Meta-Object System.
Спасибо.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

5
Алексей Внуков
  • 29 липня 2019 р. 09:51

есть пример. пару минут

    Алексей Внуков
    • 29 липня 2019 р. 10:08
    • (відредаговано)
    • Відповідь була позначена як рішення.

    wrapper.h

    #ifndef WRAPPER_H
    #define WRAPPER_H
    
    #include <QMainWindow>
    #include <QDebug>
    #include <QThread>
    #include <QCoreApplication>
    #include <workera.h>
    #include <workerb.h>
    #include <workerc.h>
    #include <workerd.h>
    #include <QProcess>
    #include <QQmlEngine>
    #include <QJSEngine>
    
    class Wrapper : public QObject
    {
        Q_OBJECT
    public:
        explicit Wrapper(QObject *parent=nullptr);
        ~Wrapper();
    
    public slots:
        Q_INVOKABLE void run_control();
        Q_INVOKABLE void stop_control();
    
    signals:
        void sig_stop_fire();
    
    private:
        WorkerA *work_1;
        WorkerB *work_2;
        WorkerC *work_3;
        WorkerD *work_4;
        QThread *thr_work_1;
        QThread *thr_work_2;
        QThread *thr_work_3;
        QThread *thr_work_4;
    };
    
    static QObject *singeltonProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
    {
        Q_UNUSED(engine);
        Q_UNUSED(scriptEngine);
    
        Wrapper *wrapper=new Wrapper();
        return wrapper;
    }
    
    #endif // WRAPPER_H
    
    

    wrapper.cpp

    #include "wrapper.h"
    
    Wrapper::Wrapper(QObject *parent)
    {
        work_1=new WorkerA();
        work_2=new WorkerB();
        work_3=new WorkerC();
        work_4=new WorkerD();
        thr_work_1=new QThread(this);
        thr_work_2=new QThread(this);
        thr_work_3=new QThread(this);
        thr_work_4=new QThread(this);
    
        work_1->moveToThread(thr_work_1);
        work_2->moveToThread(thr_work_2);
        work_3->moveToThread(thr_work_3);
        work_4->moveToThread(thr_work_4);
    
        connect(thr_work_1,&QThread::started,work_1,&WorkerA::go);
        connect(work_1,&WorkerA::sent_n, this,&Wrapper::reader_data);
    
        connect(thr_work_2,&QThread::started,work_2,&WorkerB::go);
        connect(work_2,&WorkerB::sent_n,this,&Wrapper::reader_data);
    
        connect(thr_work_3,&QThread::started,work_3,&WorkerC::go);
        connect(work_3,&WorkerC::sent_n,this,&Wrapper::reader_data);
    
        connect(thr_work_4,&QThread::started,work_4,&WorkerD::go);
        connect(work_4,&WorkerD::sent_n,this,&Wrapper::reader_data);
    
        connect(this,&Wrapper::destroyed,thr_work_1,&QThread::quit);
        connect(this,&Wrapper::destroyed,thr_work_2,&QThread::quit);
        connect(this,&Wrapper::destroyed,thr_work_3,&QThread::quit);
        connect(this,&Wrapper::destroyed,thr_work_4,&QThread::quit);
    
    }
    
    Wrapper::~Wrapper()
    {
        stop_control();
        QThread::sleep(2);
    }
    
    void Wrapper::run_control()
    {
        thr_work_1->start();
        thr_work_2->start();
        thr_work_3->start();
        thr_work_4->start();
    
        //emit print("started");
        //qDebug("started");
    }
    
    void Wrapper::stop_control()
    {
        stop_thr=false;
        thr_work_1->quit();
        thr_work_2->quit();
        thr_work_3->quit();
        thr_work_4->quit();
    
       // qDebug("controller stoped");
    }
    
    
    

    main.cpp

    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    #include <QQmlEngine>
    #include <QQmlContext>
    #include <QtQml>
    #include <wrapper.h>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    
        QGuiApplication app(argc, argv);
    
        QQmlApplicationEngine engine;
    
        QmlTranslator qmlTranslator(&engine);
    
        qmlRegisterSingletonType <Wrapper>("Wrapper",1,0,"Wrapper", singeltonProvider);
    
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
        if (engine.rootObjects().isEmpty())
            return -1;
    
        return app.exec();
    }
    
    

    воркеры живут в отдельных потоках, у каждого всегда запущен бесконечный цыкл для обработки данных, потом через сигналы передают в враппер, при необходимости во враппере или передаются в другой поток и обрабатываются дальше или обрабатываются во враппере
    в QML потом делаем

    import Wrapper 1.o
    Item
    {
        Connections
        {
            target:Wrapper
            // слот сигнала из С++
        }
    
        Wrapper.run_control()
    }
    

    п.с. вроде то что искали. если я правильно понял

      BlinCT
      • 29 липня 2019 р. 10:39

      Скорее всего это то что я и искал. Но хотел кое что уточнить, я правильно понимаю что для всех воркеров только один врапер? Не правильней ли иметь для каждого воркера только свой врапер?

        Алексей Внуков
        • 29 липня 2019 р. 10:48

        вам нужна точка взаимодействия, даже если вы сделаете для каждого воркера свой враппер, вам нужно будет делать базовый класс в котором нужно будет прописать их коннекты и взаимодействие, если этого не нужно и они должны быть полностью изолированы друг от друга, то можно попробовать объявить объект каждого враппера в main.cpp и добавить их в rootContextPropperty, и потом с ним работать как с врапером из примера

          BlinCT
          • 29 липня 2019 р. 10:52

          Спасибо за инфу) будем пробовать.

            Коментарі

            Only authorized users can post comments.
            Please, Log in or Sign up
            AD

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:50бали,
            • Рейтинг балів-4
            m
            • molni99
            • 26 жовтня 2024 р. 01:37

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:80бали,
            • Рейтинг балів4
            m
            • molni99
            • 26 жовтня 2024 р. 01:29

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:20бали,
            • Рейтинг балів-10
            Останні коментарі
            ИМ
            Игорь Максимов22 листопада 2024 р. 11:51
            Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
            Evgenii Legotckoi
            Evgenii Legotckoi31 жовтня 2024 р. 14:37
            Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
            A
            ALO1ZE19 жовтня 2024 р. 08:19
            Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
            ИМ
            Игорь Максимов05 жовтня 2024 р. 07:51
            Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
            d
            dblas505 липня 2024 р. 11:02
            QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            Тепер обговоріть на форумі
            Evgenii Legotckoi
            Evgenii Legotckoi24 червня 2024 р. 15:11
            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
            t
            tonypeachey115 листопада 2024 р. 06:04
            google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
            NSProject
            NSProject04 червня 2022 р. 03:49
            Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
            9
            9Anonim25 жовтня 2024 р. 09:10
            Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

            Слідкуйте за нами в соціальних мережах