if(m_last_state)
QCursor::setPos(this->mapToGlobal(QPoint(172, 309)));//按钮1的位置
else
QCursor::setPos(this->mapToGlobal(QPoint(400, 110)));//按钮2的位置
m_last_state = !m_last_state;
QPointF *qp = new QPointF(0, 0);
QMouseEvent *event1 = new QMouseEvent(QEvent::MouseButtonPress, *qp, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
// QApplication::sendEvent(QApplication::focusWidget(), event1);
QCoreApplication::postEvent(QApplication::focusObject(), event1);
QMouseEvent *event2 = new QMouseEvent(QEvent::MouseButtonRelease, *qp, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
// QApplication::sendEvent(QApplication::focusWidget(), event2);
QCoreApplication::postEvent(QApplication::focusObject(), event2);
sendEvent 是发送事件函数,第一个参数是接收该事件的元对象,第二个参数是要发送的事件;
使用postEvent时必须是QKeyEvent *
类型变量,如果是sendEvent则可以QKeyEvent
类型变量。
sendEvent的事件派发不通过事件循环。QApplication::sendEvent()是通过调用QApplication::notify(),直接进入了事件的派发和处理环节,是同步的。
sendEvent与postEvent的使用
两个函数都是接受一个 QObject * 和一个 QEvent * 作为参数。
postEvent 的 event 必须分配在 heep 上。用完后会被Qt自动删除
sendEvent 的 event 必须分配在 stack 上。
QMouseEvent用来构造一个模拟的鼠标事件,构造函数中定义了事件的类型为按压或者是释放,pos参数是用来指定在接收该事件的元对象的事件发生位置,例子中就是指定了在两个按钮的之间切换 分别接收按钮位置的点击事件;
QPos定义位置。
对于QLineEdit这种部件,可以通过setFocus()函数先让部件获得焦点,再把sendEvent()中的接收对象换成QWidget::focusWidget();
注意:如果只对某一个按钮或者部件发送事件可以直接在sendEvent函数中第一个参数中制定,例如
QApplication::sendEvent(my_PushButton1, event2);