gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:39:30 24 4
gpt4 key购买 nike

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

  • 当光标快速移动并移动到 handle 之前直到 handle “追上”(或者当“fluid qml”太流畅时) - 这尤其令人讨厌,因为光标形状快速变化并闪烁
  • 当光标移动到 handle 允许的自由度之外时

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

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

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

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

    最佳答案

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

    CursorChanger {
    cursor: Qt.SizeHorCursor
    active: dragArea.containsMouse || dragArea.drag.active
    }
    在 C++ 方面,您需要一个像这样的辅助类:
    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)

    // ...
    }
    在实现中你可以使用 QGuiApplication::setOverrideCursorQGuiApplication::restoreOverrideCursor实际设置/重置光标。不要忘记也在 CursorChanger 中重置如果此时处于事件状态,则析构函数。如果然后注册类型:
    qmlRegisterType<CursorChanger>(uri, 1, 0, "CursorChanger");`
    您可以从 qml 使用此类型。

    关于qt - 当光标移出其鼠标区域时,按住时保持光标形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39753226/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com