QML ApplicationWindow:设置最小尺寸以适应内容

QML ApplicationWindow: set minimum size to fit content

我想设置我的 QML 应用程序的最小宽度和高度 window,以便内容项完全可见(不被剪裁)。

import QtQuick 2.5
import QtQuick.Controls 1.4

ApplicationWindow {
    visible: true
    width: 100
    height: 100

    title: "test"

    minimumWidth: circle.width
    minimumHeight: circle.height // + menuBar.height

    menuBar: MenuBar {
        Menu {
            title: qsTr("File")
            MenuItem {
                text: qsTr("Exit")
                onTriggered: Qt.quit();
            }
        }
    }

    Rectangle {
        id: circle
        anchors.centerIn: parent
        width: 200
        height: 200
        color: "red"
        radius: width * 0.5
    }
}

结果如下:

如您所见,设置最小宽度效果很好。最小高度似乎与菜单栏的高度不符。问题是,添加类似 menuBar.height 的内容不起作用,因为 属性 不存在。

所以问题是:如何设置 ApplicationWindow 的大小,以便内容项(由 width/heightimplicitWidth/implicitHeight) 没有剪裁?

注意:实际上,内容项不是红色圆圈,而是用作游戏 canvas,我想动态调整其大小。

与旧 QtQuick.Controls 1.x 一样,唯一帮助自己的方法是查看 (undocumented/internal) 属性。 MenuBar 是:

  • 对象名称
  • 菜单
  • __contentItem
  • __parentWindow
  • __isNative
  • 风格
  • __style
  • __menuBarComponent
  • objectNameChanged
  • 菜单已更改
  • nativeChanged
  • contentItemChanged
  • 风格改变
  • __style已更改
  • __menuBarComponent已更改

__contentItem 看起来很有趣,它的特点是 height - 一旦实例化。

所以我们可以这样定义ApplicationWindow的高度:

minimumHeight: contentItem.childrenRect.height
               + (menuBar.__contentItem ? menuBar.__contentItem.height : 0)