将Leap和QT连接在一起

时间:2014-03-24 21:35:18

标签: c++ multithreading qt leap-motion

经过互联网长时间搜索后,我没有找到任何理由能够解决我的问题:

我有一个应用程序,记录用户手指按需移动,(当用户按下它的开始记录时,用户按下它停止记录,

直到现在我的应用程序都在控制台上,所以它与跳跃运动完美配合, 现在我们决定将应用程序移动到基于GUI的应用程序,我们选择了QT平台,我们将GUI与我们的解决方案集成在一起,我们已经放置了两个按钮来替换按键,并连接事件。 真正的问题是在我们想要看到由跳跃侦听器的onFrame回调捕获的内容时开始的,并且我们已经注意到,自从QT的主GUI被执行后,跳跃的回调是一些如何阻塞或者只是没有得到CPU时间(我不知道真正的问题),我们尝试了几个解决方案,比如使用从QObject继承的包装类 从那里开始一个线程,但它似乎没有任何影响。

这里是main.cpp

  int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    LeapClass::QLeapLis * smp = LeapClass::QLeapLis::get_instance();

    QThread * th =  smp->thread();
    //smp->moveToThread(th);
    th->start(QThread::HighPriority);


    w.show();

    return a.exec();
}

这里的QLeapLis是Wrapper类,它有一个启动设备的run方法, 但仍然注意到,我非常接近放弃QT。

如果有人知道如何连接这两个,我们将不胜感激

非常感谢。

2 个答案:

答案 0 :(得分:1)

您可以通过不使用Leap回调来避免此问题。您可以使用动画循环或其他方便的循环机制调用Controller :: frame()以获取最新的数据帧。 (每个Frame对象都有一个ID,因此您可以判断是否已经处理了一个帧。)

例如,在某些环境(处理,浏览器动画循环,Unity,Cinder等)中,已经存在一个以应用程序的绘图帧速率调用的更新循环。比这更频繁地处理帧数据也可能是浪费时间。即使您的应用程序还没有多线程,您也必须开始处理使用LM回调实现时多线程可能带来的一些复杂情况。

根据Kuba Ober的说法,QT小部件没有动画或绘制循环,因此他的回答显示了使用Listener回调的正确方法是正确的方法。

答案 1 :(得分:1)

下面的代码演示了如何正确使用Qt Listener API。

此代码要求通过moc运行。我还检查过它是否构建并运行Leap SDK。

#include <QApplication>
#include <QLabel>
#include "leap.h"

class MyListener : public QObject, public Leap::Listener {
public:
   virtual void onFrame(const Leap::Controller & ctl) {
      Leap::Frame f = ctl.frame();
      // This is a hack so that we avoid having to declare a signal and
      // use moc generated code.
      setObjectName(QString::number(f.id()));
      // emits objectNameChanged(QString)
   }
};

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   MyListener listener;
   Leap::Controller controller;
   controller.addListener(listener);

   QLabel frameLabel;
   frameLabel.setMinimumSize(200, 50);
   frameLabel.show();
   frameLabel.connect(&listener, SIGNAL(objectNameChanged(QString)),
                      SLOT(setText(QString)));

   int rc = a.exec();
   controller.removeListener(listener);
   return rc;
}