29 июля 2019 г. 8:41

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

qt5

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
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, и потом с ним работать как с врапером из примера

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Donate

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

AS
13 декабря 2019 г. 6:05
Aruzhan Seraliyeva

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

  • Результат:50баллов,
  • Очки рейтинга-4
AS
13 декабря 2019 г. 5:47
Aruzhan Seraliyeva

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

  • Результат:40баллов,
  • Очки рейтинга-8
Т
11 декабря 2019 г. 16:56
Тома

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

  • Результат:50баллов,
  • Очки рейтинга-4
Последние комментарии
9 декабря 2019 г. 3:41
Евгений Легоцкой

Эта ошибка invalid use of incomplete type ‘class Ui::AnotherWindow’ обычно говорит о том, что не найдено определение класса или структуры. Типичная проблема - не подключён заголовочны…
НБ
9 декабря 2019 г. 3:36
Николай Батманов

Ну, не настолько со мной всё полхо...))) Вроде бы. Я ж кнопки отрисовываю.
9 декабря 2019 г. 3:14
Евгений Легоцкой

Добрый день. У вас ui файлов по ходу нет. UI файлы используются для вёрстки в графическом дизайнере.
НБ
9 декабря 2019 г. 3:05
Николай Батманов

Здравствуйте! Полностью скопировал ваш пример к себе, чтобы разобраться. А он не хочет запускаться, дает ошибку: invalid use of incomplete type ‘class Ui::AnotherWindow’ ui(new Ui…
8 декабря 2019 г. 7:23
Евгений Легоцкой

У меня здесь есть одна старая статья с примером векторного редактора. Там есть ответы на ваши вопросы. Поизучайте Qt/C++ - Урок 072. Пример векторного редактора на Qt QGraphicsItem, QG…
Сейчас обсуждают на форуме
t
13 декабря 2019 г. 17:17
tantrido

Всё работает, при чём тут колхоз?! ;) https://doc.qt.io/qt-5/qtqml-cppintegration-data.html Если что-то не работает - вопрос к собственным рукам и знаниям. Вопрос не корректен - мож…
13 декабря 2019 г. 10:16
Руслан Волшебник

Да, я посмотрел, вы абсолютно правы. Единственное, если я правильно понял, если срабатывает условие if (aggregates["max_id"] - aggregates["min_id"]) + 1 == aggregates["count"]: return sel…
t
13 декабря 2019 г. 9:53
tantrido

Ответ >>
13 декабря 2019 г. 8:39
Александр Панюшкин

Вроде да. Только там начинаются вопросы с тем, чтобы виджет бы в фокусе, чтобы до виджета это событие долетало.
ДК
13 декабря 2019 г. 7:48
Джон Кофи

Привет. Есть класс "ждун", который используется на разных виджетах: class WaiterDialog;#define WAITER_DIALOG Singleton<WaiterDialog>::instance()class WaiterDialog : public QObject, …
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB