[英]Connecting Leap And QT Togther
經過長時間的互聯網搜索后,我沒有找到能夠解決我的問題的任何理由,這是:
我有一個應用程序可以按需記錄用戶的手指運動((當用戶按r的開始記錄,而用戶按s的停止記錄,
到現在為止,我的應用程序都在控制台上,因此它可以完美地與跳動一起工作,現在我們決定將應用程序移至基於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。
如果有人知道如何連接這兩個,我們將不勝感激
非常感謝。
您可以通過不使用Leap回調來避免此問題。 您可以使用動畫循環或其他方便的循環機制調用Controller :: frame()以獲取最新的數據幀。 (每個Frame對象都有一個ID,因此您可以知道是否已經處理了一個框架)。
例如,在某些環境(處理,瀏覽器動畫循環,Unity,Cinder等)中,已經存在一個以應用程序的繪圖幀速率調用的更新循環。 比這更頻繁地處理幀數據也可能浪費時間。 即使您的應用程序尚未使用多線程,也必須開始處理使用LM回調實現時多線程可能帶來的一些復雜性。
根據庫巴·奧伯(Kuba Ober)的觀點,QT小部件沒有動畫或繪制循環,因此他的答案顯示了使用Listener回調的正確方法是正確的方法。
下面的代碼演示了如何在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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.