Я пытаюсь создать gui для приложения дополненной реальности с помощью kinect. Идея состоит в том, чтобы использовать руки, обнаруженные отслеживанием скелета kinect, для управления приложением посредством жестов.Когда я отправляю или отправляю QMouseEvent, в позиции QPushbutton, его сигнал clicked() не испускается
Этот вопрос не касается жестов, так как эта часть моей пристройки отлично работает.
В моем приложении я хочу, чтобы имитировать щелчок мыши, когда выполняется жест щелчка. Чтобы сделать это, я отправляю два события: один, мышь и один mousebuttonreleased, так как обычный щелчок также представляет собой серию пресс-релизов.
Все это отлично работает на QWebView. В окне браузера я могу «щелкнуть» по ссылкам.
Но по какой-то причине я не могу «щелкнуть» на QPushButton. Сигнал clicked() не испускается. У меня есть небольшой пример, чтобы проиллюстрировать мою проблему:
Первая основная функция:
int main(int argc, char **argv){
QApplication app(argc, argv);
QWebViewButtons mainapp(0, Qt::Window);
app.setActiveWindow(&mainapp);
mainapp.show();
mainapp.setApplication(&app); //this is a setter to also get access to the main application in the widget
return app.exec();
}
Это мой собственный виджет:
QWebViewButtons::QWebViewButtons(QWidget* parent, Qt::WindowFlags flags): QWidget(parent, flags){
this->m_ui.setupUi(this);
QObject::connect(this->m_ui.pushButton, SIGNAL(clicked(bool)), this, SLOT(buttonClicked(bool)));
}
void QWebViewButtons::mousePressEvent(QMouseEvent* event){
printf("mouse click, %d, %d\n", event->pos().x(), event->pos().y());
}
void QWebViewButtons::buttonClicked(bool clicked){
printf("slot button clicked\n");
}
void QWebViewButtons::keyPressEvent(QKeyEvent* event){
printf("Key pressed\n");
QPoint pos(this->width()/2, this->height()/2);
QPoint global = this->mapToGlobal(pos);
QWidget *w = this->m_app->widgetAt(global);
//printf("widget under point of click: %s", w);
QApplication::sendEvent(w, new QMouseEvent(QEvent::MouseButtonPress, pos, Qt::MouseButton::LeftButton, Qt::MouseButton::LeftButton, Qt::KeyboardModifier::NoModifier));
QApplication::sendEvent(w, new QMouseEvent(QEvent::MouseButtonRelease, pos, Qt::MouseButton::LeftButton, Qt::MouseButton::LeftButton, Qt::KeyboardModifier::NoModifier));
}
Я последовал предложение здесь: Qt Artificial mouse clicks doesnt work properly и отправить отправлять события мыши непосредственно в QPushButton. Но это не помогло. Я также попытался отправить события мыши в «это» или в основное приложение.
Теперь у меня заканчиваются идеи. Что я хочу, так это то, что слот buttonClicked() вызывается, если я нажимаю любую клавишу. Но я только вызывается, если я нажму кнопку с помощью мыши. Как я могу это сделать? Или моя основная идея полностью ложна?
Спасибо за ваши идеи.
поэтому QWidget * w = this-> m_app-> widgetAt (глобальный); вы знаете, какая кнопка была активирована? но не можете сказать, что приложение было нажато? – Exa
Я знаю, какой виджет находится в этой позиции, а затем я могу проверить, является ли это кнопкой, и вызывать функцию click(). Но это не то, что я хочу, потому что тогда мне не нужно было бы отправлять события мыши. То, что я хочу, заключается в том, чтобы добиться такого же поведения, как если бы щелкнула левая кнопка мыши, и оставил Qt остальным, независимо от того, была ли кнопка или что-то еще. – Valerie