Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 当我在QPushbutton位置发送或发布QMouseEvent时,不会发出其clicked()信号_Qt_Button_Mouseevent_Signals_Signals Slots - Fatal编程技术网

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

Qt 当我在QPushbutton位置发送或发布QMouseEvent时,不会发出其clicked()信号,qt,button,mouseevent,signals,signals-slots,Qt,Button,Mouseevent,Signals,Signals Slots,我尝试使用kinect为增强现实应用程序设计gui。其思想是,使用kinect骨架跟踪检测到的手通过手势控制应用程序 这个问题与手势无关,因为我的应用程序的这一部分工作正常 在我的应用程序中,我希望在执行单击手势时模拟鼠标单击。为此,我发送了两个事件,一个是mousebuttonpressed,另一个是mousebuttonrelease,因为正常的点击也是一系列的按下和释放 整个过程在QWebView上运行良好。在浏览器窗口中,我可以“单击”链接 但由于某些原因,我无法“点击”QPushBut

我尝试使用kinect为增强现实应用程序设计gui。其思想是,使用kinect骨架跟踪检测到的手通过手势控制应用程序

这个问题与手势无关,因为我的应用程序的这一部分工作正常

在我的应用程序中,我希望在执行单击手势时模拟鼠标单击。为此,我发送了两个事件,一个是mousebuttonpressed,另一个是mousebuttonrelease,因为正常的点击也是一系列的按下和释放

整个过程在QWebView上运行良好。在浏览器窗口中,我可以“单击”链接

但由于某些原因,我无法“点击”QPushButton。单击的()信号不会发出。 我有一个简短的例子来说明我的问题:

第一,主要功能:

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 ) );
}
我在这里遵循了这个建议: 和send将我的鼠标事件直接发送到QPushButton。但那没用。 我还尝试将鼠标事件发送到“this”或主应用程序

现在我的想法快用完了。 我想要的是,如果我按下任何键,就会调用buttonClicked()插槽。但只有当我用鼠标点击按钮时,才会调用我。 我怎样才能做到这一点?还是我的基本想法完全错误


谢谢你的想法。

那么,我说得对吗?当你做“点击手势”时,你会进入按键事件吗?如果是这样,您可以检查按钮上方是否已执行“单击”,并显式调用按钮的clicked()信号。但那不是你想要的

QWebViewButtons到底是什么?用户在哪个区域做手势

您是否已调试到keyPressEvent以查看sendEvent是否具有正确的小部件(w)?我不明白为什么小部件不应该接收事件

请记住,当新建QMouseEvent并通过sendEvent发送它时,永远不会删除它。使用sendEvent时,应在堆栈上创建事件


也许您应该看看这个线程,其中建议使用QTestEventList:。但是我可以想象,您不想让测试函数完成这个任务;)

好的,诀窍是真正将点击发送到所需点击位置的确切小部件。在我的应用程序中,由于半透明的小部件相互重叠,我遇到了一些麻烦

所以widgetAt(全局)命令对我没有帮助。 但是您可以使用childAt(全局)来代替。当然,您需要知道要从哪个小部件中找到孩子


这对我来说很有帮助。:-)

所以通过QWidget*w=this->m_app->widgetAt(全局);你知道哪个按钮被激活了吗?但是不能告诉应用程序它被点击了吗?我知道哪个小部件在那个位置,然后我可以检查它是否是一个按钮,并调用buttons click()函数。但这不是我想要的,因为这样我就不需要发送鼠标事件。我想要的是,得到与鼠标左键被点击时相同的行为,剩下的由左Qt完成,不管是否有按钮或其他任何东西。我认为问题是,我不知道我应该将点击事件发送到哪个小部件/对象。在我的实际应用程序中,我不知道按钮在哪里,因为它们是通过布局定位的,甚至更糟。有几个小部件相互覆盖,其中一些是透明的。在这个应用程序中,当我调用widgetAt函数时,我没有得到按钮,即使我单击它。它返回另一个小部件。如果我将mouseevent发送到该小部件,其中一些会到达我的按钮。但并非全部。不幸的是,我不能在这里发布代码,因为这在我在上面的评论中提到的应用程序中太多了,我可以通过手势“点击”一个按钮。但是,当我尝试单击另一个按钮时,第一个按钮总是会显示mouseclickevent。无论我第一次单击哪个按钮,所有后续的单击都指向该按钮。我是如何导致这种行为的?