目的是通过坐标模拟鼠标点击事件。

关键函数:QWidget::childAt(pos);

其中pos是相对于QWidget的坐标,坐标一般有两种:全局坐标和相对坐标。通过mapToGlobal()之类的API可以转换.

QWidget* child = this->childAt(pos);
QMouseEvent *pressEvent, *releaseEvent;
pressEvent = new QMouseEvent(QEvent::MouseButtonPress, QPoint(0, 0), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
releaseEvent = new QMouseEvent(QEvent::MouseButtonRelease, QPoint(0, 0), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
QApplication::sendEvent(child, pressEvent);
QApplication::sendEvent(child, releaseEvent);

通过以上代码,在this指向窗口的pos位置的控件(一般是QPushButton)会接收到clicked()事件。

//模拟鼠标点击的第二种方法
QTest::mouseClick(child, Qt::LeftButton, Qt::NoModifier, QPoint(0, 0));
//发送事件的第二种方法
QCoreApplication::postEvent(child, pressEvent);
QCoreApplication::postEvent(child, releaseEvent);
//获取当前的焦点widget
QWidget* focus = QWidget::focusWidget();