Испускать сигнал из статической функции, не являющейся членом

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

Мой DataReceiver.h файл:

#ifndef DATARECEIVER_H
#define DATARECEIVER_H

#include <QObject>
#include "vrpn_Analog.h"

class DataReceiver : public QObject {
    Q_OBJECT

public:
    DataReceiver();

public slots:
    void check();
signals:
    void blink();
};

void VRPN_CALLBACK handle_analog( void* userData, const vrpn_ANALOGCB a );

#endif // DATARECEIVER_H

Мой DataReceiver.cpp файл:

#include "datareceiver.h"
#include "vrpn_Analog.h"

DataReceiver::DataReceiver()
{

}

void DataReceiver::check()
{
    bool running = true;

    /* VRPN Analog object */
    vrpn_Analog_Remote* VRPNAnalog;

    /* Binding of the VRPN Analog to a callback */
    VRPNAnalog = new vrpn_Analog_Remote("openvibe_vrpn_analog@localhost");
    VRPNAnalog->register_change_handler(NULL, handle_analog);

    /* The main loop of the program, each VRPN object must be called in order to process data */
    while (running)
    {
        VRPNAnalog->mainloop();
    }
}

void VRPN_CALLBACK handle_analog( void* userData, const vrpn_ANALOGCB a )
{
    for( int i=0; i < a.num_channel; i++ )
    {
        if (a.channel[i] > 0)
        {
             emit blink();
        }
    }
}

В handle_analog я пытаюсь излучать сигнал, который хочу использовать в другом классе.

void MainWindow::checkChannels()
{
    QThread *thread = new QThread;
    DataReceiver *dataReceiver = new DataReceiver();

    dataReceiver->moveToThread(thread);
    //connect(thread, SIGNAL(blink()), this, SLOT(nextImage()));
    thread->start();
}

но когда я пытаюсь запустить, я получаю ошибку:

ошибка: C2352: 'DataReceiver::blink': недопустимый вызов нестатической функции-члена

Я знаю, где моя ошибка, но я не знаю, как ее исправить.


person Sk1X1    schedule 22.04.2014    source источник


Ответы (1)


Нет смысла излучать сигнал без соответствующего объекта, из которого он излучается, поскольку вам не к чему его подключить.

Итак, что вы хотите, это передать указатель на ваш DataReceiver как userData и реализовать общедоступный метод, который испускает сигнал. Затем вы можете привести userData к DataReceiver и вызвать для него метод.

Следующий неполный код пытается показать, что я имею в виду

void DataReceiver::emitBlink() { // Should of course also be added in header.
    emit blink();
}
...
/// Pass in "this" as userData   
VRPNAnalog->register_change_handler(this, handle_analog);

...
void VRPN_CALLBACK handle_analog( void* userData, const vrpn_ANALOGCB a )
{
...
    reinterpret_cast<DataReceiver*>(userData)->emitBlink();
...
}
person Kleist    schedule 22.04.2014