我正在构建一个必须在Windows和Mac OS X上运行的QML
应用程序。我想在QML中管理菜单,所以我开始在我的应用程序中使用MenuBar组件。我在C ++中使用QQuickView
来显示我的QML元素。我的菜单在Mac OS X上正常显示,但Windows
上没有显示任何内容,日志中没有错误。
文档说明了这个组件被链接到ApplicationWindow
,但由于它在Mac OS上工作正常,我希望它在任何地方都能正常工作。
有没有办法在Windows上修复此问题?
答案 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
}
}
}
}