当光标移出其鼠标区域时,按住时保持光标形状

dte*_*ech 5 qt cursor qml mousearea

我正在实现窄的调整大小句柄,这给我带来了烦人的行为。当鼠标直接位于手柄上方时,光标形状符合预期,但是一旦开始拖动手柄,光标形状就会变得不一致。造成这种情况的原因有两个:

  • 当光标快速移动并在手柄之前移动直到手柄“追上”(或当“fluid qml”太流畅时) - 这尤其令人讨厌,因为光标形状快速变化并闪烁

  • 当光标移动到手柄允许的自由度之外时

我查了一下文档,但它似乎没有包含任何关于在按下新闻之前锁定光标的内容。

我还是设法找到一个黑客修复它-使用虚拟叠加MouseArea使用acceptedButtons: Qt.NoButton-这实际上有助于假光标的一致性,但有它自己的问题。拥有覆盖鼠标区域不允许光标在手柄上方时更改为调整大小的形状,因为手柄位于覆盖鼠标区域下方,因此根本无法修改光标形状。因此只有在单击手柄后才会开始调整大小形状,这远非理想。将覆盖鼠标区域设置为enabled: false不会改变这一点 - 它仍然会阻止来自底层鼠标区域的光标形状变化。也有一个解决方法,例如将覆盖鼠标区域大小设置为 0x0,但这有点难看。

理想情况下,光标形状应该持续到鼠标区域被按下,无论它是在其区域内还是在其区域外 - 毕竟,如果您离开它,则不会释放按下,因此鼠标区域仍然处于控制状态并且应该保持其光标形状。例如 - 窗口调整大小手柄保持调整大小形状,即使它被移动以将窗口调整为小于其最小尺寸,直到按下被释放。

在我看来,实现中似乎存在缺陷MouseArea- 按下时不保留光标形状,即使禁用鼠标区域,光标形状也会更改。

Adv*_*sus 1

我没有找到一种开箱即用的方法,但为此创建一个助手非常容易。在 qml 方面,您可以例如:

CursorChanger {
    cursor: Qt.SizeHorCursor
    active: dragArea.containsMouse || dragArea.drag.active
}
Run Code Online (Sandbox Code Playgroud)

在 C++ 方面,您需要一个如下所示的帮助器类:

CursorChanger {
    cursor: Qt.SizeHorCursor
    active: dragArea.containsMouse || dragArea.drag.active
}
Run Code Online (Sandbox Code Playgroud)

在实现中,您可以使用QGuiApplication::setOverrideCursorQGuiApplication::restoreOverrideCursor来实际设置/重置光标。CursorChanger如果此时处于活动状态,请不要忘记在析构函数中进行重置。如果您随后注册类型:

class CursorChanger : public QObject
{
    Q_OBJECT

    Q_PROPERTY(bool active READ active WRITE setActive NOTIFY activeChanged)
    Q_PROPERTY(int cursor READ cursor WRITE setCursor NOTIFY cursorChanged)
    
    // ...
}
Run Code Online (Sandbox Code Playgroud)

您可以从 qml 使用此类型。