【问题标题】:Are native menu bars for MacOS supported in Qt Quick?Qt Quick 是否支持 MacOS 的本机菜单栏?
【发布时间】:2019-02-20 13:36:33
【问题描述】:

在我正在处理的项目中,我需要一个菜单​​栏(文件、编辑、视图等)与之交互。我在 Mac 上工作,所以我希望能够使用 OS X 中已经提供的菜单栏,但是从我看到的所有文档和已经回答的问题来看,看起来只有 QMainWindow 才正确支持,a Qt Widgets 的一部分,而不是 Qt Quick。 Qt Quick 中的 Mac 是否支持本机菜单栏,还是我必须编写一些特定于平台的代码来实现?提前感谢您的帮助!

【问题讨论】:

  • 事实上,在 OS X 上使用非本地菜单需要付出额外的努力——而且菜单根本不需要 QMainWindow。简而言之:OS X 上的菜单是原生的,除非你强迫它们不原生。
  • @KubaOber 我知道这一点,但是如何在 Qt Quick 中创建一个菜单栏,该菜单栏将上升到实际的 OS X 菜单栏,而不仅仅是创建一个沿我的应用程序顶部?我还没有找到任何方法,我想知道它是否受支持。
  • 他们可能应该默认这样做......我很惊讶他们不这样做。
  • 你看过doc.qt.io/qt-5.11/qml-qt-labs-platform-menubar.html。唯一的坏处是 qt labs 中的所有内容可能无法在未来版本的 qt 中工作,然后它真的会咬人。
  • @mlvljr 我已经做到了。尽管我对一个实现细节感到非常沮丧,该实现细节是为了没有窗口的系统的利益而改变的,这使得弹出菜单(例如 ComboBox 生成的那些弹出菜单)被周围的 Qt Quick 小部件剪切。这意味着我被限制在我的 QML 小部件中不添加任何内容,并且在我需要向用户提供选择列表时寻找替代品。

标签: macos qt menu qtquick2


【解决方案1】:

Rolf Winter said,您可以拥有一个带有 Qt Quick / QML 的原生 Mac OS 菜单栏,而无需使用小部件。来自MenuBar QML Type

当然,它是一个 Qt Labs 组件,因此在生产中使用它存在一定的风险(没有保证/稳定性)。

这是一个简化的例子:

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
import Qt.labs.platform 1.1

ApplicationWindow {
    width: 500
    minimumWidth: 500
    height: 300
    minimumHeight: 300
    visible: true
    title: qsTr("Testing Mac OS native Menu Bar in Qt Quick")

    MenuBar {
        id: menuBar

        Menu {
            id: fileMenu
            title: qsTr("File")

            MenuItem {
                text: qsTr("Ololo")
                onTriggered: console.debug("ololo menu item clicked")
            }

            // this one won't show up in File menu because of its `role`,
            // and it will actually appear in the main menu - under the application name,
            // where you'd usually expect About menu to be
            MenuItem {
                //text: qsTr("About")    // no need to set the text,
                role: MenuItem.AboutRole // because it gets generated
                onTriggered: console.debug("show your About window")
            }
        }

        Menu {
            id: editMenu
            title: qsTr("Edit")

            MenuItem {
                text: qsTr("Stuff")
                onTriggered: console.debug("stuff menu item clicked")
            }
        }
    }
}

你的问题是关于 Mac OS 的,所以我没有做任何事情来使菜单跨平台(例如,在 Windows 上,你可能想将关于菜单项移动到帮助菜单并实际给它一些文本)。

无论如何,在 Mac OS 上,结果将如下所示:

如您所见,Edit 菜单还填充了几个“奖励”项(不确定这是由 Qt 还是 Mac OS 处理的)。

以防万一,我的环境:

  • Mac OS 11.5.2
  • Qt 5.15.2

【讨论】:

    【解决方案2】:

    您甚至可以尝试通过添加 QMenuBar 从 cpp 获取它,然后附加您想要的菜单,例如文件、编辑等。看看这个https://doc.qt.io/qt-5/qmenubar.html 我这样做是因为我没有使用来自 QML 的 ApplicationWindow,而是从 QQuickWindow 派生的自定义窗口。

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 2023-01-23
      • 1970-01-01
      • 2013-04-09
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 2013-09-25
      相关资源
      最近更新 更多