после долгих поисков в интернете я не нашел ни одного разумного решения моей проблемы, а именно:
у меня есть приложение, которое записывает движение пальца пользователя по требованию (когда пользователь нажимает кнопку r, чтобы начать запись, когда пользователь нажимает кнопку s, она останавливает запись,
до сих пор приложение находилось на консоли, поэтому оно отлично работало при скачкообразном движении,
Теперь мы решили переместить приложение в приложение с графическим интерфейсом, и мы выбрали платформу QT, мы интегрировали графический интерфейс с нашим решением, поместили две кнопки для замены нажатия клавиши и соединили события.
реальная проблема началась, когда мы захотели увидеть, что было захвачено обратным вызовом onFrame прослушивателя скачка, и мы заметили, что с тех пор, как предварительно сформирован главный графический интерфейс QT, некоторые обратные вызовы скачка блокируются или просто не получают процессорное время (я не знаю реальной проблемы), мы попробовали несколько решений, таких как использование класса-оболочки, который наследуется от 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.
если кто-то знает, как соединить эти два, мы будем благодарны
Большое спасибо.
Код ниже демонстрирует, как вы должны использовать Listener
API правильно с Qt.
Этот код делает не требуется пройти через 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;
}
Вы можете избежать этой проблемы, не используя обратные вызовы Leap. Вы можете вызвать Controller :: frame (), используя цикл анимации или другой удобный механизм зацикливания, чтобы получить последний кадр данных. (Каждый объект Frame имеет идентификатор, поэтому вы можете сказать, обработали ли вы уже кадр).
Например, в некоторых средах (Обработка, цикл анимации браузера, Unity, Cinder и т. Д.) Уже есть цикл обновления, который вызывается с частотой кадров рисования приложения. Более частая обработка данных кадра также может быть пустой тратой времени. Даже если ваше приложение еще не является многопоточным, вам придется столкнуться с некоторыми сложностями, которые могут возникнуть с многопоточностью при использовании реализации обратного вызова LM.
По словам Кубы Обера, виджеты QT не имеют анимации или цикла рисования, поэтому его ответ, показывающий правильный способ использования обратных вызовов Listener, является правильным подходом.