当我发送或发布QMouseEvent时,在QPushbutton的位置,它的clicked()信号不会被发出

时间:2011-05-16 14:14:52

标签: qt button mouseevent signals signals-slots

我尝试使用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()插槽。但是如果我用鼠标点击按钮,我只会被调用。 我怎么能做到这一点?或者我的基本想法是完全错误的?

感谢您的想法。

2 个答案:

答案 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(全局)代替。当然,您需要知道要从哪个小部件中找到孩子。

这对我有用。 : - )