我有一个 QWiget 子类应用程序,它实现了自己的逻辑、gui、build、.. wigdet 应用程序,它应该是 myo 腕带和 Parrot Drone 的连接器。与无人机的连接工作正常,问题出在腕带上。我有一个实现wirstband监听器的类
#include <MyoLibrary/include/myo/myo.hpp>
class MyoDeviceListener: public myo::DeviceListener
{
public:
MyoDeviceListener();
virtual void onArmSync(myo::Myo *myo, uint64_t timestamp, myo::Arm arm, myo::XDirection xDirection, float rotation, myo::WarmupState warmupState) override;
virtual void onArmUnsync(myo::Myo *myo, uint64_t timestamp) override;
virtual void onBatteryLevelReceived(myo::Myo *myo, uint64_t timestamp, uint8_t level) override;
virtual void onPair(myo::Myo *myo, uint64_t timestamp, myo::FirmwareVersion firmwareVersion) override;
virtual void onUnpair(myo::Myo *myo, uint64_t timestamp)override;
virtual void onLock(myo::Myo *myo, uint64_t timestamp) override;
virtual void onUnlock(myo::Myo *myo, uint64_t timestamp) override;
virtual void onPose(myo::Myo *myo, uint64_t timestamp, myo::Pose pose)override;
strong text
};
和cpp。
#include "myodevicelistener.h"
#include <qDebug>
MyoDeviceListener::MyoDeviceListener()
{
}
void MyoDeviceListener:: onArmSync(myo::Myo *myo, uint64_t timestamp, myo::Arm arm, myo::XDirection xDirection, float rotation, myo::WarmupState warmupState)
{
qDebug()<<"synced";
}
void MyoDeviceListener::onArmUnsync(myo::Myo *myo, uint64_t timestamp)
{
qDebug()<<"unsynced";
}
void MyoDeviceListener::onBatteryLevelReceived(myo::Myo *myo, uint64_t timestamp, uint8_t level)
{
qDebug()<<"battery"<<level;
}
void MyoDeviceListener::onPair(myo::Myo *myo, uint64_t timestamp, myo::FirmwareVersion firmwareVersion)
{
qDebug()<<"Paired";
}
void MyoDeviceListener::onUnpair(myo::Myo *myo, uint64_t timestamp)
{
qDebug()<<"unpaired";
}
void MyoDeviceListener::onLock(myo::Myo *myo, uint64_t timestamp)
{
qDebug()<<"locked";
}
void MyoDeviceListener:: onUnlock(myo::Myo *myo, uint64_t timestamp)
{
qDebug()<<"unlocked";
}
void MyoDeviceListener::onPose(myo::Myo *myo, uint64_t timestamp, myo::Pose pose)
{
switch(pose.type())
{
case 1: qDebug()<<"Fist";
myo->notifyUserAction();
break;
case 2: qDebug()<<"Wave in";
myo->notifyUserAction();
break;
case 3: qDebug()<<"Wave out";
myo->notifyUserAction();
break;
case 4: qDebug()<<"Spread Fingers";
myo->notifyUserAction();
break;
}
myo->unlock(myo->unlockHold);
if (pose.type()==5)
{
qDebug()<<"double tapped";
qDebug()<<"Lock.";
myo->lock();
}
}
为了开始这个,我在 mainwindow.cpp 中创建了一个方法
void MainWindow::startMyo()
{
try
{
//Application Identifier muss ein reverse String sein
myo::Hub hub("com.adcsp.myo");
qDebug()<<"Verbundenes Myo wird gesucht...";
myo::Myo* myo =hub.waitForMyo(10000);
if(!myo)
{
qDebug()<<"Myo nicht gefunden.";
}
else
{
qDebug()<<"Myo wurde gefunden.";
MyoDeviceListener myoDL;
hub.addListener(&myoDL);
while (1)
{
hub.run(1000/20);
}
}
}
catch(std::exception& e )
{
qDebug()<<"error: "<<e.what();
}
}
问题显然是,一旦我调用此方法,Gui 就会冻结 while 循环的原因。myo 连接本身工作正常,我得到了我想要的所有手势。
我知道我需要一个 Qthread,但我不明白这在我的情况下是如何工作的。我喜欢很多这样的博客:
https://conf.qtcon.org/system/attachments/104/original/multithreading-with-qt.pdf?1473018682
https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/
还在 Qthread 中尝试了这个 正在运行的功能 - 应用程序最终会挂起 我只得到一个分段折叠
当然还有 QT Doco。不幸的是,没有什么能真正起作用,我只是对如何在 QT 5.7 中以正确的方式使用 QThread 感到困惑
我知道我需要以某种方式对我的方法进行子类化,或者只是为了连接信号和插槽(虽然不确定是哪一个)
但我到底该怎么做呢?以及我必须如何在我的主窗口中启动线程。?
我希望你能给我一些tips
编辑:经过几个小时的尝试和错误,它现在可以使用此解决方案 在 Qthread 中运行功能 - 应用程序将挂起
只需要改变一些东西,比如移除 QTimer。Ty 对于那些试图帮助我的人。