【问题标题】:Menubars in QtQuick Controls 2QtQuick Controls 2 中的菜单栏
【发布时间】:2016-10-18 18:09:38
【问题描述】:

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

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

【问题讨论】:

  • 请尝试发布一个完整的示例...您的根元素是什么?你的进口是什么?如果使用ApplicationWindow,则该属性似乎存在于 5.7... (doc.qt.io/qt-5.7/…)。

标签: qt qml qtquick2 qtquickcontrols2


【解决方案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
}

现在我可以使用所有现代 Qt.Quick.Controls 2 的精美功能和改进,同时轻松获得原生菜单(Windows 位于窗口顶部,Mac 位于屏幕顶部)。

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

【讨论】:

    【解决方案2】:

    我在宣布发布 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 Quick Controls 2.0 – a new beginning!:“Qt Quick Controls 2 中没有原生样式——所有样式都是跨平台的,并且在所有平台上看起来都一样。”我不认为 Qt.labs.platform 模块是 Qt Quick Controls 2 的一部分。如果您想要原生控件,请坚持使用 Qt Quick Controls 1(在需要时将其与一些 Qt Quick Controls 2 混合使用)。
    • 您是否阅读了 J-P Nurmi 对我的评论的回复?你提到的报价谈到了风格。我想支持本机菜单栏或托盘图标或类似的东西与按钮的样式或类似的东西略有不同。或者也许他稍微改变了主意,为菜单栏、托盘图标或对话框添加了一些例外。
    • 是的,我只是在谈论QQC2。我相信对原生平台菜单的支持不会是 QQC2 的一部分,而是另一个模块。
    • 我明白了,是的,这是有道理的。
    • @GrecKo 我认为它将是同一个模块的一部分,只是一个不同的导入,就像Qt.labs.calendarqtquickcontrols2.git 的一部分一样。
    【解决方案3】:

    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 的 dev 分支,你已经可以开始使用这些了。

    顺便说一句,如果您不确定 Qt Quick Controls 2 中的等效类型是什么,可以使用“类型比较表”here(尽管它是 unfortunately currently missingMenuBar)。

    【讨论】:

    • 嗯,我正在使用 Qt,这样我就可以编写一次并在任何地方使用它。我能够在每个支持 QtQuick Controls 1.* 的平台上拥有原生菜单栏。
    • 感谢您提供的信息。
    • Qt.labs.platform 在 Qt 5.7 中可用吗?好像不是这样的。
    • @VioletGiraffe 不,它将在 5.8 中提供。
    【解决方案4】:

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

    Documentation is here.

    我意识到这是一个老问题,但这对于像我这样的路人来说可能仍然相关。

    【讨论】:

      【解决方案5】:

      Qt Quick Controls 2 的ApplicationWindow 没有menuBar 属性,它已被更可定制的header property 取代,它接受Item(但它不再接受MenuBar) .

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多