Как функция в Qt принимает переданные аргументы из двух мест? - PullRequest
0 голосов
/ 13 мая 2019

Я хочу написать функцию CH1_Hard_Soft для обработки данных, которая принимает два аргумента от двух разных функций.

   double MainWindow::getdata_CH1(double time)
   {
        ...

        double CH1_data=0;
        switch (CH1.Source) {
        case 0:    //software-hard
        CH1_data = CH1_Hard_Soft(time);
        ....
   }

Функция CH1_Hard_Soft должна принять время аргумента от getdata_CH1 и принять QVector из другого потока. И функция CH1_Hard_Soft обработает эти данные и затем вернет QVector в getdata_CH1 (удвоенное время). Я не знаю, как это сделать. Пожалуйста, дайте мне несколько советов, как это сделать. СПАСИБО !!!

1 Ответ

0 голосов
/ 13 мая 2019

Вы можете использовать объект функции: создать новый класс с двумя атрибутами (по одному на параметр). Создайте установщик для каждого параметра (или переопределите оператор (), чтобы он был ближе к поведению реальной функции).

Каждый сеттер должен проверить, установлены ли другие. В этом случае позвоните вам по алгоритму и отправьте результат с сигналом.

Например:

Простой рабочий, выполненный в другом потоке. Через 3 секунды он отправит поддельные данные

class Worker: public QObject
{
    Q_OBJECT
public:
    Worker(): QObject()
    {
    }

    void timerEvent(QTimerEvent* ev)
    {
        qDebug() << Q_FUNC_INFO;
        emit getVector(QVector<int>() << 2 << 4 << 6 << 8);
        killTimer(timerId);
    }
public slots:
    void run()
    {
        timerId = startTimer(3000);
    }
signals:
    void getVector(QVector<int> const& vec);
private:
    int timerId;
};

Объект Function: он будет принимать два параметра (двойное и векторное)


// For convenience. Define a value and a flag to check if the value is well set
template<typename T> struct Param
{
    T value;
    bool isInit;
    Param(): isInit(false)
    {}
    void setValue(T const& v)
    {
        value = v;
        isInit = true;
    }
};


// The processor
class Processor: public QObject
{
    Q_OBJECT
public:
    Processor(QObject* parent=nullptr): QObject(parent)
    {}

    void operator()(QVector<int> const& vector)
    {
        values.setValue(vector);
        if (time.isInit)
            process();
    }

    void operator()(double t)
    {
        time.setValue(t);
        if (values.isInit)
            process();
    }
signals:
    void done(double result);
private:

    // Will be called as soon as all the parameters are set
    void process()
    {
        // DO something
        qDebug() << Q_FUNC_INFO;
        emit done(time.value * values.value.length());
    }
    Param<QVector<int> > values;
    Param<double> time;
};
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // Run the thread
    Worker* worker = new Worker();
    QThread* th = new QThread();
    worker->moveToThread(th);
    QObject::connect(th, &QThread::started, worker, &Worker::run);

    Processor CH1_Hard_Soft;

    // Will be called when the CH1_Hard_Soft will send its result
    QObject::connect(&CH1_Hard_Soft, &Processor::done, [=](double result) { qDebug() << "RESULT" << result; });

    // Set the param vector
    QObject::connect(worker, &Worker::getVector, [&](QVector<int> const& vec) { CH1_Hard_Soft(vec); });

    // Call CH1_Hard_Soft with the first param
    double time = 12.6;
    CH1_Hard_Soft(time);


    th->start();

    return app.exec();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...