2015-08-21 24 views
2

添加菜单,我有以下代码:错误QML

import QtQuick 2.4 
import QtQuick.Window 2.2 
import QtQuick.Dialogs 1.2 
import QtQuick.Controls 1.4 

ApplicationWindow { 
    title: qsTr("Hello World!") 
    width: 640 
    height: 480 
    visible: true 

    menuBar: MenuBar { 
     id: menuBar 
    } 

    MouseArea 
    { 
     anchors.fill: parent 
     onClicked: { menuBar.menus.addItem("test") } 
    } 
} 

当我运行它,然后单击,出现以下消息:

qrc:/main.qml:19: TypeError: Property 'addItem' of object [object Object] is not a function 

这是为什么?

编辑:从https://stackoverflow.com/users/24283/timday 获取建议我这样做:

import QtQuick 2.4 
import QtQuick.Window 2.2 
import QtQuick.Dialogs 1.2 
import QtQuick.Controls 1.4 

ApplicationWindow { 
    title: qsTr("Hello World!") 
    width: 640 
    height: 480 
    visible: true 

    menuBar: MenuBar 
    { 
     id: menuBar 

     function addMenu(text) 
     { 
      var newObject = Qt.createQmlObject('import QtQuick.Controls 1.4; Menu { id: test; title: "Test" }', 
       menuBar, "dynamicSnippet1"); 

      newObject.visible = true 
     } 
    } 

    MouseArea 
    { 
     anchors.fill: parent 
     onClicked: { menuBar.addMenu("Test") } 
    } 
} 

但是,我不能让菜单显示。

编辑:由于这似乎是不可能做我想做的,我结束了timday的建议:

import QtQuick 2.4 
import QtQuick.Window 2.2 
import QtQuick.Dialogs 1.2 
import QtQuick.Controls 1.4 

ApplicationWindow { 
    title: qsTr("Hello World!") 
    width: 640 
    height: 480 
    visible: true 

    menuBar: MenuBar 
    { 
     id: menuBar 

     Menu { id: menu00; visible: false; } 
     Menu { id: menu01; visible: false; } 
     Menu { id: menu02; visible: false; } 
     Menu { id: menu03; visible: false; } 
     Menu { id: menu04; visible: false; } 
     Menu { id: menu05; visible: false; } 
     Menu { id: menu06; visible: false; } 
     Menu { id: menu07; visible: false; } 
     Menu { id: menu08; visible: false; } 
     Menu { id: menu09; visible: false; } 
     Menu { id: menu10; visible: false; } 
     Menu { id: menu11; visible: false; } 
     Menu { id: menu12; visible: false; } 
     Menu { id: menu13; visible: false; } 
     Menu { id: menu14; visible: false; } 
     Menu { id: menu15; visible: false; } 
     Menu { id: menu16; visible: false; } 
     Menu { id: menu17; visible: false; } 
     Menu { id: menu18; visible: false; } 
     Menu { id: menu19; visible: false; } 

     property variant topMenus: [ menu00, menu01, menu02, menu03, menu04, 
            menu05, menu06, menu07, menu08, menu09, 
            menu10, menu11, menu12, menu13, menu14, 
            menu15, menu16, menu17, menu18, menu19 ] 
     property int currMenu: 0 

     function addMenu(text) 
     { 
      if (currMenu == topMenus.length) 
       console.log("Index out of range") 
      else 
      { 
       var menu = topMenus[currMenu] 
       menu.visible = true 
       menu.title = text 
       currMenu++ 
       return menu 
      } 
     } 
    } 

    MouseArea 
    { 
     anchors.fill: parent 
     onClicked: { menuBar.addMenu("Test") } 
    } 
} 
+2

请提供完整的工作代码,无需依赖或可阻止执行的内容。 – BaCaRoZzo

+0

呃? *完全正常工作(直到您点击)QML代码; Qt5.5 qmlscene运行它就好了。 – timday

+1

我根据BaCaRoZzo进行了修改,现在它已完全正常工作(但出现错误)。感谢BaCa。 – chila

回答

2

实际上你需要有一个MenuMenuBar添加MenuItem s到。就像这样:

import QtQuick 2.4 
import QtQuick.Window 2.2 
import QtQuick.Dialogs 1.2 
import QtQuick.Controls 1.4 

ApplicationWindow { 
    title: qsTr("Hello World!") 
    width: 640 
    height: 480 
    visible: true 

    menuBar: MenuBar { 
    id: menuBar 
    Menu { 
     id: tests 
     title: "Tests" 
    } 
    } 

    MouseArea 
    { 
    anchors.fill: parent 
    onClicked: { 
     tests.addItem("Test"); 
    } 
    } 
} 

这(与Qt5.5.0的qmlscene运行)在酒吧一个“测试” Menu开始,并增加了一个“测试”项目,然后每次从菜单栏单击(远)。你必须点击打开菜单才能看到当然的项目。

动态创建Menu s有点困难;请参阅Qt.createQmlObjectQt.createComponent文档。 (在你的代码中声明你需要的所有东西可能会更简单,但是它们的visible属性连接到任何合适的逻辑)。

更新:如您在更新的问题注意了,我刚刚确认自己,简单地增加一个动态创建MenuMenuBar孩子似乎不足以让Menu出现。我注意到它也不会导致MenuBar的列表变得更大。不幸的是,追加到QML lists并不容易,它们与JavaScript数组不同。并且,MenuBar可能会有一些有趣的事情......甚至试图将新的菜单列表或空列表分配给它会导致错误消息。可能值得提出一个更好的问题/请求(或者更简单,如果可能的话),QtJira中动态MenuBarMenu项目......但我怀疑Qt在某些平台上使用本地菜单可能会产生任何限制,通用分母级别的功能可能。

对于“B计划”最初使用隐藏的占位符,这个工程我的理智Linux系统上:

import QtQuick 2.4 
import QtQuick.Window 2.2 
import QtQuick.Dialogs 1.2 
import QtQuick.Controls 1.4 

ApplicationWindow { 
    title: qsTr("Hello World!") 
    width: 640 
    height: 480 
    visible: true 

    menuBar: MenuBar { 
    id: menubar 
    Menu {title: "File"} 
    Menu {id: testsmenu;title: "Tests";visible: false} 
    Menu {title: "Help"} 
    } 

    MouseArea { 
    anchors.fill: parent 
    onClicked: { 
     testsmenu.visible=true 
     testsmenu.addItem("Test") 
    } 
    } 
} 

更具普遍意义:它发生在我,我稍微可疑的应用程序设计,的前提是的有一组非常动态的菜单栏菜单来显示用户。菜单用户体验模式的全部内容是非常静态的,用户的“肌肉记忆”可以让他们快速浏览它......但是如果菜单是相当随机的进出,那就会中断。 (确定一些应用程序可能会在几种不同的模式下呈现不同的菜单集合,例如带有编辑/调试模式的IDE,但这对于上面的“Plan B”风格和QML的状态和接线菜单可见性概念是相当可行的应用程序状态)。

+0

我想要做的是动态创建'测试'菜单。我会研究这些文档,谢谢。 – chila

+0

我根据您的建议进行了修改。 – chila

+2

我正在构建的应用程序远不是平常的;)可疑。 – chila