12

如何在 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)

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

4

5 回答 5

7

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

import QtQuick.Controls 2.3

老答案:

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

但是,最近添加Qt.labs.platform了该模块,它增加了对本机控件的支持,例如. 此模块中的类型是完全原生的,但可定制性较低。如果您克隆.MenuBarqtquickcontrols2.git

顺便说一句,如果您不确定 Qt Quick Controls 2 中的等价类型是什么,这里有一个“类型比较表” 尽管不幸的是目前缺少 MenuBar)。

于 2016-06-17T08:42:25.320 回答
6

我在宣布发布 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

于 2016-06-17T10:26:40.303 回答
4

ApplicationWindowQt Quick Controls 2 没有menuBar属性,它已被一个更可定制的接受(但它不再接受)的header属性所取代。ItemMenuBar

Qt Quick Controls 2 并非旨在提供原生桌面应用程序,而是旨在提供简单、高效和可定制的组件。例如,在 QQC2 中,您将使用 aToolBar或 aTabBar作为headerApplicationWindow

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

于 2016-06-17T08:28:09.607 回答
2

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

文档在这里。

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

于 2018-01-21T09:58:29.203 回答
1

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

我找到的解决方案是QtQuick.Controls 1仅将其导入并用于主窗口和菜单栏。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
}

现在我可以使用modernQt.Quick.Controls 2的所有花哨功能和改进,同时轻松获得本机菜单(Windows 位于窗口顶部,Mac 位于屏幕顶部)。

MenuBar请注意,要使其正常工作,仅声明;是不够的。它必须设置menuBarApplicationWindow.

于 2020-07-10T00:29:36.040 回答