【问题标题】:Simulate mouse click for QWebEngineView模拟 QWebEngineView 的鼠标点击
【发布时间】:2016-12-04 15:45:26
【问题描述】:

我想编写一个程序来自动测试不同屏幕尺寸的网络尺寸。我使用 QWebEngineView 创建窗口,我需要模拟用户鼠标单击并拖动网页中的放置元素。我尝试了 qApp->sendEvent 和 qApp->postEvent 但没有工作。

QMouseEvent *event1 = new QMouseEvent (QEvent::MouseButtonPress, point,
Qt::LeftButton,
Qt::LeftButton,
Qt::NoModifier);

qDebug() << qApp->sendEvent (driver, static_cast <QEvent *> ( event1 ) );

QMouseEvent *event2 = new QMouseEvent (QEvent::MouseButtonRelease, point,
Qt::LeftButton,
Qt::LeftButton,
Qt::NoModifier);

qDebug() << qApp->sendEvent (driver, static_cast <QEvent *> ( event2 ));

两个类都返回true,但网页中的事件没有被触发。我需要先关注视图吗?它没有父母,它是一个窗口。不再使用图形元素。 你能帮帮我吗?

Ps:我不想使用 javascript 因为:我无法使用 javascript 模拟点击来聚焦输入,它没有坐标来测试画布的拖放。

【问题讨论】:

    标签: qt view click mouseevent qtwebengine


    【解决方案1】:

    看来你必须访问QWebEngineView的一个子对象,然后给它发送事件。下面是鼠标左键单击的一个实现。你可以改变位置clickPos来释放和按模拟拖动。

    void LeftMouseClick(QWidget* eventsReciverWidget, QPoint clickPos)
    {
        QMouseEvent *press = new QMouseEvent(QEvent::MouseButtonPress,
                                                clickPos,
                                                Qt::LeftButton,
                                                Qt::MouseButton::NoButton,
                                                Qt::NoModifier);
        QCoreApplication::postEvent(eventsReciverWidget, press);
        // Some delay
        QTimer::singleShot(300, [clickPos, eventsReciverWidget]() {
            QMouseEvent *release = new QMouseEvent(QEvent::MouseButtonRelease,
                                                    clickPos,
                                                    Qt::LeftButton,
                                                    Qt::MouseButton::NoButton,
                                                    Qt::NoModifier);
            QCoreApplication::postEvent(eventsReciverWidget, release);
        }));
    }
    QWebEngineView webView = new QWebEngineView();
    // You need to find the first child widget of QWebEngineView. It can accept user input events.
    QWidget* eventsReciverWidget = nullptr;
    foreach(QObject* obj, webView->children())
    {
        QWidget* wgt = qobject_cast<QWidget*>(obj);
        if (wgt)
        {
            eventsReciverWidget = wgt;
            break;
        }
    }
    QPoint clickPos(100, 100);
    LeftMouseClick(eventsReciverWidget, clickPos);
    

    借用以下答案Qt WebEngine simulate Mouse Event How to send artificial QKeyEvent to QWebEngineView?

    【讨论】:

      猜你喜欢
      • 2021-04-15
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多