Qt 移动车窗不能正常工作

Qt 移动车窗不能正常工作,qt,qml,Qt,Qml,问题是窗口的坐标设置不正确。因此,窗口移动不正确,出现错误: QWindowsWindow::setGeometry:无法在QQuickApplicationWindow_QML_0/''上设置几何图形400x400+62998+32284 我不知道怎么解决这个问题。代码如下: main.qml import QtQuick 2.12 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 ApplicationWindow { i

问题是窗口的坐标设置不正确。因此,窗口移动不正确,出现错误:

QWindowsWindow::setGeometry:无法在QQuickApplicationWindow_QML_0/''上设置几何图形400x400+62998+32284

我不知道怎么解决这个问题。代码如下:

main.qml

import QtQuick 2.12
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3

ApplicationWindow {
    id: window
    visible: true
    width: 400
    height: 400
    title: qsTr('Frameless')
    flags: Qt.Window | Qt.FramelessWindowHint

    Rectangle {
        width: parent.width
        height: 40
        color: "gold"

        anchors.top: parent.top

        Text {
            anchors.verticalCenter: parent.verticalCenter
            leftPadding: 8
            text: window.title
            color: "white"
        }

        MouseArea {
          anchors.fill: parent

          property real lastMouseX: 0
          property real lastMouseY: 0

          onPressed: {
             lastMouseX = mouse.x
             lastMouseY = mouse.y
          }
          onMouseXChanged: window.x += (mouse.x - lastMouseX)
          onMouseYChanged: window.y += (mouse.y- lastMouseY)
        }
    }
}
main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>


int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}
#包括
#包括
int main(int argc,char*argv[])
{
QCoreApplication::setAttribute(Qt::AA_enableHighdDiscaling);
QGUI应用程序应用程序(argc、argv);
qqmlaplicationengine;
engine.load(QUrl(QStringLiteral(“qrc:/main.qml”));
if(engine.rootObjects().isEmpty())
返回-1;
返回app.exec();
}

即使您使用QML解决了这个问题,您也会看到窗口将以很大的抖动移动。这主要是因为绑定是如何工作的(异步的)。一个更好的方法是询问C++的代码> q游标::POSH()/代码> BR> BR> 下面是一个简单的方法:

main.qml
中创建一个
MouseArea

MouseArea {
    property var clickPos
    anchors.fill: parent
    onPressed: {
        clickPos = { x: mouse.x, y: mouse.y }
    }
    onPositionChanged: {
        window.x = cpp_helper_class.cursorPos().x - clickPos.x
        window.y = cpp_helper_class.cursorPos().y - clickPos.y
    }
}

在C++ cppHelpRelphi类中,你应该有以下方法:

Q_INVOKABLE QPointF cursorPos() { return QCursor::pos(); }

<代码> QY-VoNoCube 确保您的C++代码可以从QML访问。 您的

main.cpp
还应包含以下内容:

context->setContextProperty("cpp_helper_class", &helper_class_instance);

您应该更仔细地阅读文档。MouseArea.MouseArea的参数为。没有
mouseX
mouseY
,因此存储一些随机值。还要注意的是,
mouse.x
是真实的,因此在
int
中存储时会丢失精度。另一个建议是使用调试器,它允许立即解决此类问题。我稍微修改了代码,但仍然保持了效果。也许你知道一个有效的解决方案?我想不出来。没有id为
main window
的项目,
ApplicationWindow.visible
默认为false,您必须显式将其设置为true。看起来您提供的代码与您测试的代码不同,并且还有一些其他因素会影响窗口位置。我的项目中有两个文件:main.cpp和main.qml。我添加了它们。对我来说仍然不起作用。
window.x+=(mouse.x-lastMouseX)
这始终是增量的,并且将无限期地增长。