qt - QtQuick Controls 2 中的菜单栏

标签 qt qml qtquick2 qtquickcontrols2

如何在 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)
附言它曾经使用设备的 native 菜单系统,例如在 OS X 上它使用 native 屏幕的顶部栏菜单栏,在 Linux 和 Windows 上它在应用程序顶部栏菜单栏中使用 native 等。

最佳答案

我自己在处理这个问题时遇到了这个问题。 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的精美功能和改进,同时轻松获得 native 菜单(Windows 位于窗口顶部,Mac 位于屏幕顶部)。
请注意,要使其正常工作,仅声明 MenuBar 是不够的。 ;它必须设置为menuBar ApplicationWindow 的属性(property).

关于qt - QtQuick Controls 2 中的菜单栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37872504/

相关文章:

c++ - QFile/QDataStream 写入现有数据

animation - QML 中的 anchor 动画

Qt商业许可证

c++ - 如何在 iOS 上的 QT/QML 中使用剪贴板

qt - QML:如何处理鼠标悬停?

qml - GridLayout 和 Grid 有什么区别

c++ - QtQuick : create component from C++

qt - 为什么 QML MediaPlayer/VideoOutput 对我不起作用?

c++ - Qt::BackgroundRole 似乎被忽略了

python - 在 python 中使用 pytest 测试基于 QML 的应用程序