我尝试使用kinect为增强现实应用程序设计一个gui。这个想法是,使用kinect骨架跟踪检测到的手来通过手势控制应用程序。
这个问题不是关于手势,因为这部分我的推荐工作正常。
在我的应用程序中,我想在执行单击手势时模拟鼠标单击。要做到这一点,我发送两个事件,一个鼠标按钮,一个鼠标按钮发布,正常点击也是一系列按下和释放。
整个过程在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。但这没有帮助。 我还尝试将鼠标事件发送到“this”或主应用程序。
现在我的想法已经不多了。 我想要的是,如果我按任意键,就会调用buttonClicked()插槽。但是如果我用鼠标点击按钮,我只会被调用。 我怎么能做到这一点?或者我的基本想法是完全错误的?
感谢您的想法。
答案 0 :(得分:1)
那么,我做对了吗?在进行“点击手势”时,你会进入keyPressEvent?如果是这样,您可以检查按钮上方是否已完成“单击”,并显式调用按钮的clicked()信号。但那不是你想要的?
QWebViewButtons究竟是什么?用户做手势的区域?
您是否已调试到keyPressEvent以查看您的sendEvent是否具有正确的小部件(w)?我不明白为什么小部件不应该接收事件......
请记住,当新建一个QMouseEvent并通过sendEvent发送它时,永远不会被删除。使用sendEvent时,您应该在堆栈上创建事件。
也许您应该看看这个线程,其中建议使用QTestEventList:Mimicking/faking a Mouse Click and Mouse Wheel using Qt。但我可以想象你不希望测试函数做到这一点;)
答案 1 :(得分:0)
好的,诀窍是真正将点击发送到所需点击位置的EXACT小部件。在我的应用程序中,由于半透明的小部件相互叠加,我遇到了一些麻烦。
所以widgetAt(全局)命令不会帮助我。 但您可以使用childAt(全局)代替。当然,您需要知道要从哪个小部件中找到孩子。
这对我有用。 : - )