qwebengineview需要打开触摸屏属性才能实现地图拖动吗
时间: 2023-08-24 11:05:17 浏览: 179
是的,如果您使用的是 Qt 5.9.0 的 QWebEngineView 组件,在 Ubuntu 平板上加载百度地图时,需要打开触摸屏属性才能实现地图拖动。具体操作如下:
1. 进入 Ubuntu 系统的设置界面。
2. 打开“触摸屏和鼠标”选项卡。
3. 将“触摸屏启用”选项打开,并设置“触摸屏模式”为“指针”。
4. 关闭设置界面并重新启动应用程序。
通过以上操作,您应该可以在应用程序中使用触摸屏拖动百度地图了。如果仍然无法实现地图拖动,您可以尝试更新 Qt 版本或者使用其他浏览器组件来加载百度地图。
相关问题
Qwebengineview无法实现触屏拖动怎么办
如果您在使用QWebEngineView时无法实现触摸拖动,您可以考虑为QWebEngineView添加触摸事件处理程序。您可以通过重写QWidget的`touchEvent(QTouchEvent*)`方法来处理触摸事件。在处理触摸事件时,您可以捕获触摸点的位置,并使用`QWebEngineView::scroll()`方法来实现拖动效果。
以下是一个示例代码,演示了如何为QWebEngineView添加触摸事件处理程序:
```cpp
class TouchWebView : public QWebEngineView
{
public:
TouchWebView(QWidget* parent = nullptr) : QWebEngineView(parent)
{
setAttribute(Qt::WA_AcceptTouchEvents);
}
protected:
void touchEvent(QTouchEvent* event) override
{
if (event->touchPoints().count() == 1 && event->touchPointStates() == Qt::TouchPointPressed)
{
m_lastTouchPos = event->touchPoints().first().pos();
}
else if (event->touchPoints().count() == 1 && event->touchPointStates() == Qt::TouchPointMoved)
{
QPointF delta = event->touchPoints().first().pos() - m_lastTouchPos;
scroll(delta.x(), delta.y());
m_lastTouchPos = event->touchPoints().first().pos();
}
}
private:
QPointF m_lastTouchPos;
};
```
在这个例子中,我们创建了一个名为`TouchWebView`的子类,该子类重写了`touchEvent(QTouchEvent*)`方法。我们还通过`setAttribute(Qt::WA_AcceptTouchEvents)`方法启用了触摸事件处理。在`touchEvent(QTouchEvent*)`方法中,我们检查了触摸事件的状态,并使用`QWebEngineView::scroll()`方法来实现拖动效果。
您可以使用这个`TouchWebView`类来代替QWebEngineView,并在您的应用程序中使用它,以实现触摸拖动效果。
Qwebengineview加载地图触屏拖动怎么办
如果您在使用QWebEngineView加载地图并希望实现触摸拖动地图的效果,您可以通过以下步骤实现:
1. 首先,您需要在QWebEngineView中添加JavaScript代码来处理地图的拖动。您可以使用`evaluateJavaScript()`方法在QWebEngineView中执行JavaScript代码。以下是一个示例代码,演示了如何在OpenStreetMap中实现拖动效果:
```cpp
QWebEngineView* view = new QWebEngineView(this);
view->load(QUrl("https://www.openstreetmap.org"));
view->page()->runJavaScript("var map = L.map('map').setView([51.505, -0.09], 13);\n"
"L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n"
" attribution: 'Map data © <a href=\"https://openstreetmap.org\">OpenStreetMap</a> contributors',\n"
" maxZoom: 18\n"
"}).addTo(map);\n"
"map.dragging.enable();");
```
在这个例子中,我们通过`load()`方法加载了OpenStreetMap,并在QWebEngineView中执行了JavaScript代码来创建地图和启用拖动效果。 `runJavaScript()`方法用于在QWebEngineView中执行JavaScript代码。
2. 然后,您需要为QWebEngineView添加触摸事件处理程序,以便将触摸事件转换为JavaScript代码。您可以使用与前面示例中相同的代码,将`TouchWebView`类添加到您的应用程序中。然后,在`touchEvent(QTouchEvent*)`方法中,您可以使用`evaluateJavaScript()`方法将触摸事件转换为JavaScript代码,并在QWebEngineView中执行。以下是一个示例代码,演示了如何实现拖动效果:
```cpp
void TouchWebView::touchEvent(QTouchEvent* event)
{
if (event->touchPoints().count() == 1 && event->touchPointStates() == Qt::TouchPointPressed)
{
m_lastTouchPos = event->touchPoints().first().pos();
m_isScrolling = false;
}
else if (event->touchPoints().count() == 1 && event->touchPointStates() == Qt::TouchPointMoved)
{
QPointF delta = event->touchPoints().first().pos() - m_lastTouchPos;
m_lastTouchPos = event->touchPoints().first().pos();
if (!m_isScrolling)
{
evaluateJavaScript(QString("map.dragging._startMove(new L.MouseEvent('mousemove', {clientX: %1, clientY: %2}));").arg(m_lastTouchPos.x()).arg(m_lastTouchPos.y()));
m_isScrolling = true;
}
evaluateJavaScript(QString("map.dragging._onMove(new L.MouseEvent('mousemove', {clientX: %1, clientY: %2}));").arg(m_lastTouchPos.x()).arg(m_lastTouchPos.y()));
}
else if (event->touchPoints().count() == 1 && event->touchPointStates() == Qt::TouchPointReleased)
{
evaluateJavaScript(QString("map.dragging._onUp(new L.MouseEvent('mouseup', {clientX: %1, clientY: %2}));").arg(m_lastTouchPos.x()).arg(m_lastTouchPos.y()));
}
}
```
在这个例子中,我们重写了`touchEvent(QTouchEvent*)`方法,将触摸事件转换为JavaScript代码,并在QWebEngineView中执行。在处理触摸事件时,我们首先检查了触摸事件的状态,并使用`evaluateJavaScript()`方法将触摸事件转换为JavaScript代码。然后,我们使用`map.dragging`对象的`_startMove()`和`_onMove()`方法来实现拖动效果。最后,我们在`touchPointStates() == Qt::TouchPointReleased`状态下使用`_onUp()`方法停止拖动。
请注意,这里我们直接调用了`map.dragging`对象的私有方法`_startMove()`、`_onMove()`和`_onUp()`,这不是推荐的做法,因为这可能会导致您的应用程序与地图库的未来版本不兼容。建议使用地图库的公共API来实现拖动效果。
阅读全文