Qt 模擬滑鼠事件-在兩個按鈕之間切換

oadaaa發表於2018-10-12
    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);

相關文章