BlinCT
BlinCT29. Juli 2019 08:41

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

qt5

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

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

5
Алексей Внуков
  • 29. Juli 2019 09:51

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

    Алексей Внуков
    • 29. Juli 2019 10:08
    • (bearbeitet)
    • Die Antwort wurde als Lösung markiert.

    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. Juli 2019 10:39

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

        Алексей Внуков
        • 29. Juli 2019 10:48

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

          BlinCT
          • 29. Juli 2019 10:52

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

            Kommentare

            Nur autorisierte Benutzer können Kommentare posten.
            Bitte Anmelden oder Registrieren
            Letzte Kommentare
            A
            ALO1ZE19. Oktober 2024 08:19
            Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
            ИМ
            Игорь Максимов5. Oktober 2024 07:51
            Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
            d
            dblas55. Juli 2024 11:02
            QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            k
            kmssr8. Februar 2024 18:43
            Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            Jetzt im Forum diskutieren
            J
            JacobFib17. Oktober 2024 03:27
            добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
            JW
            Jhon Wick1. Oktober 2024 15:52
            Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
            КГ
            Кирилл Гусарев27. September 2024 09:09
            Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
            F
            Fynjy22. Juli 2024 04:15
            при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

            Folgen Sie uns in sozialen Netzwerken