29 июля 2019 г. 7:41

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

qt5

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

Виртуальный хостинг со скидкой 10 процентов
Виртуальный хостинг со скидкой 10 процентов
EVILEG предлагает надёжный хостинг со скидкой 10% на виртуальный хостинг и 5% на VPS
5

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

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()
}

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

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

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

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
D
16 августа 2019 г. 11:58
Damir

C++ - Тест 003. Условия и циклы

  • Результат:92баллов,
  • Очки рейтинга8
D
16 августа 2019 г. 11:46
Damir

C++ - Тест 005. Структуры и Классы

  • Результат:75баллов,
  • Очки рейтинга2
u
14 августа 2019 г. 13:55
unrealproro

C++ - Тест 005. Структуры и Классы

  • Результат:83баллов,
  • Очки рейтинга4
Последние комментарии
19 августа 2019 г. 6:41
Андрей Янкович

это проблема дистрибутива, попробуйте установить через пакетный менеджер snap Суть проблемы: libQt5Core которая лежит в дистрибутиве требует версию glibc >= 2.25 у вас видимо …
b
18 августа 2019 г. 5:09
bbb116

cqtdeployer /home/aleks/CQtDeployer/bin/cqtdeployer: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by /home/aleks/CQtDeployer/lib/libQt5Core.so.5) linux mint …
D
17 августа 2019 г. 8:04
Damir

github ChekableTView Правой групповая смена значения при перетаскивании левой как обычно.
Сейчас обсуждают на форуме
20 августа 2019 г. 12:17
Евгений Легоцкой

Добрый день. Вы делаете некорректную попытку создать исключение. Исключения генерируются кодом, то есть любое исключение, которое вы перехватываете, всегда генерируется оператором th…
20 августа 2019 г. 11:44
Евгений Легоцкой

Ну вообще это я вам не решение вашей задачи кинул, а просто как пример... Регулярку вам надо было бы самому придумать.. Ну вот так будет работать TextField { validator: RegExpValida…
20 августа 2019 г. 8:04
IscanderChe

Ещё раз здравствуйте. Собираю Qt-проект с помощью CMake. Применяю к полученному exe-файлу windeployqt. В результате подцепляются почему-то dll-ки, оканчивающиеся в наименованиях на "d": Qt…
20 августа 2019 г. 7:46
IscanderChe

Да, с таргетом тоже работает. Спасибо!
20 августа 2019 г. 7:25
Евгений Легоцкой

вы можете испльзовать QList, просто помещайте туда QPair, будет примерно тоже самое. Просто QMap автоматически сортируется по ключу. QList<QPair<QString, QString>> list_with_pair;…
Ищу работу?
14,000.00 руб. - 40,000.00 руб.
Разработчик Qt
Annino, Moscow Oblast, Russia
5,000.00 руб. - 15,000.00 руб.
Дизайнер
Moskovskiy, Moscow, Russia
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB