Qml 中的自定义标题栏

问题描述 投票:0回答:1

我想为带有粘性边缘和自定义按钮和背景的qml应用程序创建metro风格的标题栏(类似于“mahapps.metro”的东西),我已经创建了这样的东西:

import QtQuick.Controls.Universal 2.12
ApplicationWindow{
    id: window
    width: Screen.width * 5/6
    height: Screen.height * 5/6
    flags:Qt.Window | Qt.CustomizeWindowHint
    menuBar : Rectangle{
        width: parent.width
        height: 35
        color: Universal.color(Universal.Emerald)
        Row{
            anchors.right: parent.right
            anchors.verticalCenter: parent.verticalCenter
            spacing: 5
            layoutDirection: Qt.RightToLeft
            CustomButton{
                //close
            }
            CustomButton{
                //maximize
            }
            CustomButton{
                //minimize
            }
        }
        MouseArea{
            //deal with dragging
            anchors.fill: parent
            property variant clickPos: "1,1"
            onPressed: {
                if(window.visibility != 4 && window.visibility != 5)
                    clickPos  = Qt.point(mouse.x,mouse.y)
            }
            onDoubleClicked: {
                var item = window.Maximized;
                if(window.visibility != 4 && window.visibility != 5){
                    window.showMaximized()
                }
                else{
                    window.showNormal()
                }
            }

            onPositionChanged: {
                if(window.visibility != 4 && window.visibility != 5){
                    var delta = Qt.point(mouse.x-clickPos.x, mouse.y-clickPos.y)
                    window.x += delta.x;
                    window.y += delta.y;
                }
            }
        }
    }
}

我有一些问题:

  1. 如何在 QML 或 QT 中实现粘性边缘?
  2. 有没有图书馆已经这样做了?
  3. 我可以用 QTitleBar 制作一个符合我要求的自定义标题栏吗?
  4. 有没有带有自定义标题栏的开源应用程序?
  5. Material Design 有没有适合 windows 的风格,至少可以帮助我制作它?
qt qml
1个回答
0
投票

您有 2 个选择来解决这个问题:

  1. 为每个边缘创建 4 个不同的 MouseArea(类似于奶酪方法)
  2. 另一种方法是覆盖窗口事件并从头开始,这将使您完全控制窗口。
© www.soinside.com 2019 - 2024. All rights reserved.