qt5.9.0 qwebengineview加载地图触屏无法拖动怎么设置
时间: 2023-08-24 19:05:17 浏览: 51
您可以通过设置 QWebEngineView 的属性实现该功能。具体步骤如下:
1. 继承 QWebEngineView 类,重写 mousePressEvent()、mouseReleaseEvent()、mouseMoveEvent() 方法,以实现触屏拖动地图的功能。
2. 在 mousePressEvent() 方法中,记录下鼠标按下时的坐标。
3. 在 mouseReleaseEvent() 方法中,记录下鼠标释放时的坐标,并计算出两个坐标之间的差值,即为拖动的距离。
4. 在 mouseMoveEvent() 方法中,如果拖动距离大于一定阈值(比如10像素),则执行拖动操作,并将鼠标按下时的坐标更新为当前鼠标的坐标。
5. 在程序初始化时,调用 QWebEngineView 的 setAttribute() 方法,设置 Qt::WA_AcceptTouchEvents 属性为 true,以开启触屏支持。
6. 如果需要禁止鼠标拖动地图,则可以在 mousePressEvent() 方法中禁用拖动操作。
下面是示例代码:
```c++
class MapView : public QWebEngineView
{
Q_OBJECT
public:
explicit MapView(QWidget *parent = nullptr);
protected:
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
private:
bool m_dragging;
QPoint m_dragStartPos;
};
MapView::MapView(QWidget *parent)
: QWebEngineView(parent)
, m_dragging(false)
{
// 开启触屏支持
setAttribute(Qt::WA_AcceptTouchEvents, true);
}
void MapView::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_dragging = true;
m_dragStartPos = event->pos();
}
QWebEngineView::mousePressEvent(event);
}
void MapView::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
if (m_dragging) {
QPoint dragEndPos = event->pos();
QPoint dragDelta = dragEndPos - m_dragStartPos;
if (dragDelta.manhattanLength() > 10) {
// 执行拖动操作
QPoint scrollPos = page()->scrollPosition();
scrollPos -= dragDelta;
page()->runJavaScript(QString("window.scrollTo(%1, %2);").arg(scrollPos.x()).arg(scrollPos.y()));
}
}
m_dragging = false;
}
QWebEngineView::mouseReleaseEvent(event);
}
void MapView::mouseMoveEvent(QMouseEvent *event)
{
if (m_dragging) {
QPoint dragDelta = event->pos() - m_dragStartPos;
if (dragDelta.manhattanLength() > 10) {
// 更新鼠标按下时的坐标
m_dragStartPos = event->pos();
}
}
QWebEngineView::mouseMoveEvent(event);
}
```
在以上示例代码中,我们重写了三个鼠标事件,实现了触屏拖动地图的功能。其中,m_dragging 变量记录了当前是否正在进行拖动操作,m_dragStartPos 变量记录了鼠标按下时的坐标。在 mousePressEvent() 方法中,我们记录下鼠标按下时的坐标,并将 m_dragging 变量设置为 true。在 mouseReleaseEvent() 方法中,我们记录下鼠标释放时的坐标,并计算出拖动的距离。如果拖动距离大于一定阈值,则执行拖动操作,并将 m_dragStartPos 变量更新为当前鼠标的坐标。在 mouseMoveEvent() 方法中,如果正在进行拖动操作,则计算出鼠标移动的距离,如果距离大于一定阈值,则更新 m_dragStartPos 变量。最后,在程序初始化时,我们调用了 setAttribute() 方法,开启了触屏支持。