在Windows上的QQuickView中使用MenuBar组件

时间:2013-11-08 12:17:32

标签: windows qml qt5 qtquick2

我正在构建一个必须在Windows和Mac OS X上运行的QML应用程序。我想在QML中管理菜单,所以我开始在我的应用程序中使用MenuBar组件。我在C ++中使用QQuickView来显示我的QML元素。我的菜单在Mac OS X上正常显示,但Windows上没有显示任何内容,日志中没有错误。

文档说明了这个组件被链接到ApplicationWindow,但由于它在Mac OS上工作正常,我希望它在任何地方都能正常工作。

有没有办法在Windows上修复此问题?

2 个答案:

答案 0 :(得分:2)

似乎QQuickView无法包含ApplicationWindow作为根对象。 您是否尝试使用QQmlApplicationEngine代替QQuickView

#include <QtGui/QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine("qml/untitled/main.qml");
    QObject* root = engine.rootObjects().at(0);
    static_cast<QWindow*>(root)->show();
    return app.exec();
}

我在Windows上面临同样的问题,它帮助了我。

答案 1 :(得分:2)

我查看了在QML ApplicationWindow组件中完成此操作的方式,并找到了在Windows上显示菜单的方法。想法/黑客是使用__contentItem组件的属性MenuBar并将其附加到根元素。我也是这样做的,只有菜单不是原生菜单才能像以前在Mac OS X上那样工作。

<强> TopMenu.qml

import QtQuick 2.1
import QtQuick.Controls 1.0

MenuBar {
  Menu {
    title: "Window"
    MenuItem {
      text: "SubMenu3"
      shortcut: "Ctrl+s"
    }
    MenuItem {
      text: "SubMenu2"
      shortcut: "Ctrl+p"
    }
    MenuItem {
      text: "Preferences"
      shortcut: "Ctrl+,"
    }
  }
}

<强> RootElement.qml

import QtQuick 2.1

Rectangle {
    id: rootWindow
    width: 400
    height: 400


    Item {
        id: menuWrapper
        anchors.fill: parent

        TopMenu {
          id: myTopMenu
        }

        states: State {
          name: "hasMenuBar"
          when: myTopMenu && !myTopMenu.__isNative

          ParentChange {
              target: myTopMenu.__contentItem
              parent: rootWindow
          }

          PropertyChanges {
              target: myTopMenu.__contentItem
              x: 0
              y: 0
              width: menuWrapper.width
          }
        }
    }
}