QtQuick 控件 2 中的菜单栏

Menubars in QtQuick Controls 2

如何在 QtQuick Controls 2 中使用菜单栏?以前是这样的(在ApplicationWindow中):

menuBar: MenuBar {
    Menu {
        title: qsTr('File')
        MenuItem {
            text: qsTr('&Test')
            onTriggered: console.log('test')
        }
        MenuItem {
            text: qsTr('&Exit')
            onTriggered: Qt.quit();
        }
    }
}

但是在升级到 Qt 5.7 之后出现了这个错误:Invalid property name "menuBar".(M16)

P.S。它曾经使用设备的本机菜单系统,例如在 OS X 它使用本机屏幕的顶部栏菜单栏,在 Linux 和 Windows 它在应用程序顶部栏菜单栏等使用本机

接受ItemApplicationWindow of Qt Quick Controls 2 doesn't have a menuBar property, it has been replaced by a more customizable header property(但不再接受MenuBar)。

Qt Quick Controls 2 并非旨在提供本机桌面应用程序,而是旨在提供简单、高效和可自定义的组件。例如,在 QQC2 中,您可以使用 ToolBarTabBar 作为 ApplicationWindow.

header

虽然没有记录,但似乎只是将 MenuBar 作为 ApplicationWindow 的子项(在 QQC1 和 QQC2 中)在 OS X 上设置本机菜单栏(不过 Android 上没有,而且我还没有在其他平台上测试过)。

MenuBar 现已可用,并已添加到 Qt 5.10 中。使用 QtQuick.Controls 2.3 或更高版本:

import QtQuick.Controls 2.3

旧答案:

正如 GrecKo 所说,桌面不是模块的焦点,因此,您不会在主导入中找到 MenuBar 控件。直到最近,我一直在使用包含一堆 ToolButton 控件的 RowLayout,每个控件都会打开一个 Menu,以便模拟桌面应用程序的菜单栏。

但是,Qt.labs.platform 模块是 recently added,它增加了对 MenuBar 等原生控件的支持。此模块中的类型是完全原生的,但可定制性较低。如果您克隆 qtquickcontrols2.git.

的开发分支,您已经可以开始使用这些了

顺便说一句,如果您不确定 Qt Quick Controls 2 中的等效类型是什么,可以使用 "Type Comparison Table" here (although it's unfortunately currently missing MenuBar).

我在宣布发布 Qt 5.7 的 Qt 博客上问了同样的问题,这是他们的回答:http://blog.qt.io/blog/2016/06/16/qt-5-7-released/#comment-1197915

看来我们应该等待 Qt 5.8 或按照 Mitch 在他的回答中建议的那样克隆 repo。

更新

现在在 Qt Quick Controls 2 中实现了:https://doc.qt.io/qt-5.10/qml-qtquick-controls2-menubar.html

此功能已在 Qt 5.10 中为 Controls2 引入。 界面非常相似,只是 MenuItems 已被更通用的 Action 取代。

Documentation is here.

我意识到这是一个老问题,但这可能对像我这样的路人仍然有意义。

我自己在处理这个问题时遇到了这个问题。如前所述,Qt.labs.platform 不适用于 Windows,并且 Qt.Quick.Controls 2 不会尝试在任何内容上原生实现菜单。如果您想要实际的系统原生菜单而不是自定义 QML 对象,这是不令人满意的。

我找到的解决方案是导入 QtQuick.Controls 1 并将其仅用于主 window 和菜单栏。 QML 的导入语法使这很容易。例如:

import QtQuick.Controls 2.12
import QtQuick.Controls 1.2 as OldControls

OldControls.ApplicationWindow {
    visible: true
    
    menuBar: OldControls.MenuBar { // Should attach natively
        OldControls.Menu {
            title: 'File'
            OldControls.MenuItem {
                text: 'New'
                shortcut: StandardKey.New
                onTriggered: context.new()
            }
        }
    }
    
    Button { ... } // QtQuick.Controls 2 version
}

现在我可以使用现代 Qt.Quick.Controls 2 的所有奇特功能和改进,同时毫不费力地获得本地菜单(在 Windows 的 window 顶部,在 Windows Mac).

的屏幕顶部

请注意,要使其正常工作,仅声明 MenuBar 是不够的;它必须设置为 menuBar 属性 的 ApplicationWindow.