BlinCT
BlinCTШілде 29, 2019, 8:41 Т.Ж.

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

qt5

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

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

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

5
Алексей Внуков
  • Шілде 29, 2019, 9: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 Т.Ж.

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

            Пікірлер

            Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
            Кіріңіз немесе Тіркеліңіз
            Г

            C++ - Тест 001. Первая программа и типы данных

            • Нәтиже:66ұпай,
            • Бағалау ұпайлары-1
            t

            C++ - Тест 001. Первая программа и типы данных

            • Нәтиже:33ұпай,
            • Бағалау ұпайлары-10
            t

            Qt - Тест 001. Сигналы и слоты

            • Нәтиже:52ұпай,
            • Бағалау ұпайлары-4
            Соңғы пікірлер
            G
            GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
            Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
            d
            dblas5Шілде 5, 2024, 11:02 Т.Ж.
            QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            k
            kmssrАқп. 8, 2024, 6:43 Т.Қ.
            Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            АК
            Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
            Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            Енді форумда талқылаңыз
            Evgenii Legotckoi
            Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
            F
            FynjyШілде 22, 2024, 4:15 Т.Ж.
            при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
            BlinCT
            BlinCTМаусым 25, 2024, 1 Т.Ж.
            Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
            BlinCT
            BlinCTМамыр 5, 2024, 5:46 Т.Ж.
            Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
            Evgenii Legotckoi
            Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

            Бізді әлеуметтік желілерде бақылаңыз