2015-08-21 44 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