3

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

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

有没有办法在 Windows 上解决这个问题?

4

2 回答 2

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 上遇到了同样的问题,它帮助了我。

于 2013-11-12T17:51:19.913 回答
2

我查看了在 QMLApplicationWindow组件中完成此操作的方式,并找到了一种在 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+,"
    }
  }
}

根元素.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
          }
        }
    }
}
于 2013-11-13T14:08:02.210 回答