【问题标题】:How can I drag an entire frameless QWidget by clicking and dragging on an element inside of a QWebView?如何通过单击并拖动 QWebView 内的元素来拖动整个无框架 QWidget?
【发布时间】:2026-01-28 02:30:02
【问题描述】:

我目前有一个包含 QWebView 的 QWidget。容器 QWidget 是半透明且无框的。我已经能够通过单击并拖动 QWidget 的外部来拖动无框窗口,但是当我单击 QWebView 中的任何内容时,我无法拖动。

我的目标是能够在 QWebView 的 DOM 中创建一个类或 id 为“drag-handle”的元素。然后,在应用程序中,我想找到任何名为“drag-handle”的元素并将其绑定到拖动事件,这样我就可以使用它来拖动整个 QWidget 容器。

我希望这是有道理的,如果您认为这对我有用,请随时向我指出一些文档或示例材料的方向,我非常乐意尝试在我的如果有人能指出我正确的方向,请拥有。

【问题讨论】:

    标签: qt drag-and-drop qwidget qwebview


    【解决方案1】:

    我认为你不应该使用拖动事件,而应该使用鼠标事件。您应该扩展 QWebVew 类,覆盖鼠标处理程序事件并:

    • 当您的“拖动手柄”对象上的鼠标按下事件将被处理时,您可以设置 Qt::ClosedHandCursor 光标。
    • 在处理鼠标移动事件后,您应该计算鼠标移动偏移量,并在计算出的偏移量上分别移动主窗口。像这样:

    QPoint offset = previousPos – event->pos(); mainWindow->move(mainWindow->pos() + offset);

    • 当鼠标释放事件将被处理时,您可以重置鼠标光标。

    为了实现这个功能,你可以使用 QStateMachine。

    【讨论】:

    • 感谢您的回复。我目前在无框架 QWidget 周围拖动的方法使用这种计算偏移量的方法......我不完全理解的是如何从 Qt 代码中获取“拖动手柄”元素,以便我可以处理鼠标按下事件。