c++ QML移动无框架ApplicationWindow,保持MouseArea

dauxcl2d  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(135)

配置(我现在可以从我的公司获得的最新版本):

*Qt 5.12

  • Red Hat 7.9 Linux服务器
  • 简体中文

我在一个项目中,窗口的标题栏不能个性化,因为我想(添加徽标,更新按钮右上角,...)。因此,我创建了一个无框架的ApplicationWindow(带有Qt.FrameLessWindowHint和Qt.Window标志),并在顶部添加一个矩形,在该矩形上添加所需的所有组件。
但是,没有窗口的原始标题栏,我无法再移动窗口。所以我添加一个MouseArea来填充我的矩形,并计算窗口的新位置,如下所示:
main.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5

ApplicationWindow
{
    id: mainWindow

    property int    previousX:      0
    property int    previousY:      0
    property bool   isFullScreen:   false

    visible:        true
    visibility:     Qt.Window
    title:          ""
    minimumWidth:   1400
    minimumHeight:  900
    flags:          Qt.Window | Qt.FramelessWindowHint

    Rectangle
    {
        id: mainWindowTitleBar
        anchors
        {
            top:        parent.top
            left:       parent.left
            right:      parent.right
        }
        width:          parent.width
        height:         30
        color:          "white"
        z:              1

        MouseArea
        {
            id: mouseAreaToChangePosition
            anchors.fill: parent

            onPressed:
            {
                previousX = mouseX
                previousY = mouseY
            }

            onMouseXChanged:
            {
                var dx = mouseX - previousX
                mainWindow.setX(mainWindow.x + dx)
            }

            onMouseYChanged:
            {
                var dy = mouseY - previousY
                mainWindow.setY(mainWindow.y + dy)
            }

            onDoubleClicked:
            {
                if (isFullScreen)
                {
                    mainWindow.visibility = Qt.WindowMinimized
                }
                else
                {
                    mainWindow.visibility = Qt.WindowFullScreen
                }

                isFullScreen = !isFullScreen
            }
        }
    }
}

关于main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include <QQmlContext>

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

        QGuiApplication app(argc, argv);
        QQmlApplicationEngine engine;

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

        return app.exec();
    }
    catch(const std::exception& ex)
    {
        // Handle any exceptions that might occur during application execution
        qDebug().noquote() << "Error: " << ex.what();
        return 1;
    }
}

但是,这样做,移动对我来说是不正确的,因为我不能“隐藏”一半的窗口拖动它在屏幕的边界。可接受的最小和最大位置是应用程序完全显示在屏幕上的位置。
有没有可能直接调用ApplicationWindow的事件来进一步使用这个功能?我在互联网上看到关于暴露QGuiApplication在QML中,但我不知道如何发送新位置的事件。
先谢谢你。

knsnq2tg

knsnq2tg1#

您可以通过从QML调用QWindow::startSystemMove来让窗口处理它:

MouseArea {
    anchors.fill: parent
    onPressed: mainWindow.startSystemMove()
}

注意:你也可以通过在Window中执行visibility: isFullScreen ? Qt.WindowFullScreen : Qt.Window和在MouseArea中执行onDoubleClicked: mainWindow.isFullScreen = !mainWindow.isFullScreen来简化全屏代码。

相关问题