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 它在应用程序顶部栏菜单栏等使用本机
接受Item
的ApplicationWindow
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 中,您可以使用 ToolBar
或 TabBar
作为 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 取代。
我意识到这是一个老问题,但这可能对像我这样的路人仍然有意义。
我自己在处理这个问题时遇到了这个问题。如前所述,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
.
如何在 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 它在应用程序顶部栏菜单栏等使用本机
接受Item
的ApplicationWindow
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 中,您可以使用 ToolBar
或 TabBar
作为 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 取代。
我意识到这是一个老问题,但这可能对像我这样的路人仍然有意义。
我自己在处理这个问题时遇到了这个问题。如前所述,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
.