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

Я пытался использовать 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»: недопустимый вызов нестатической функции-члена

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

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();
...
}
1

Другие решения


По вопросам рекламы [email protected]