我第一次尝试使用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:&#39; DataReceiver :: blink&#39; :非静态成员函数的非法调用
我知道,我的错误在哪里,但我不知道如何修复它。
答案 0 :(得分: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();
...
}