我有一个应用程序,记录用户手指按需移动,(当用户按下它的开始记录时,用户按下它停止记录,
直到现在我的应用程序都在控制台上,所以它与跳跃运动完美配合, 现在我们决定将应用程序移动到基于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。
如果有人知道如何连接这两个,我们将不胜感激
非常感谢。
答案 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;
}