qml无边框窗口拖动时晃动解决方法

穿精又带淫゛_ 提交于 2020-03-01 12:06:24

百度到的qml无边框窗口拖动的解决办法基本都是根据鼠标点击位置和当前窗口位置来计算移动路径。但是窗口在拖动时会出现晃动,根据打印信息可以看出,qml中获取的当前鼠标坐标数值异常,解决办法是增加一个简单的类为qml提供当前鼠标坐标,具体实现如下:

  1. 光标提供类
class CursorPosProvider : public QObject
{
    Q_OBJECT
public:
    explicit CursorPosProvider(QObject *parent = nullptr) : QObject(parent)
    {
    }
    virtual ~CursorPosProvider() = default;

    Q_INVOKABLE QPointF cursorPos()
    {
        return QCursor::pos();
    }
};
  1. 注册该类为qml属性
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQuickView view;

    CursorPosProvider mousePosProvider;

    view.rootContext()->setContextProperty("mousePosition", &mousePosProvider);

    view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}
  1. 自定义一个titleBar组件:CustomToolBar.qml
ToolBar{
    id: root
    width: parent.width
    color: "#0099d6" // just random one

    property QtObject container

    // extra properties, maybe some signals

    MouseArea {
        id: titleBarMouseRegion
        property var clickPos
        anchors.fill: parent
        onPressed: {
            clickPos = { x: mouse.x, y: mouse.y }
        }
        onPositionChanged: {
            container.x = mousePosition.cursorPos().x - clickPos.x//container是主窗口id
            container.y = mousePosition.cursorPos().y - clickPos.y
        }
    }
}
  1. 在主窗口中调用
    header: CustomToolBar { }

完成。 原文:https://stackoverflow.com/questions/39088835/dragging-frameless-window-jiggles-in-qml

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!