2017-05-25 228 views
0

我在StackOverflow中研究了有關此主題的其他問題,但它沒有幫助我。我是QML/Javascript的新手,我通過關於這個問題的QML文檔,但它沒有幫助。動態加載另一個qml文件中的qml組件並訪問該組件的qml類型屬性

下面是一個文件 'SmallWindow.qml'

Item 
    { 
    ... 
    property var statusColour: calStatusColour(() 
    property Component devViewNameComponent: devNameComp 
    function calStatusColour() 
    { 
     var color = "black" //Here, colour will be changed based on some status. 
    } 

    Row 
    { 
     Component{ 
      id:devNameComp 

     Rectangle 
     { 
      id:statusRect 
      width: parent.width * 0.2 
      height: parent.height 
      color: statusColour.color 
      Text 
       { 
       id: viewName 
       anchors.centerIn: parent 
       text: statusText == 0 ? "TrueText" : "FalseText" 
       font.pixelSize: 20 
       } 
     } 
       } //end of component 

    Rectangle 
    {...} 

    } 
} 

我還有一個文件「FileDetailWindow.qml。在這個文件中,在函數'showDetailWindow'中,我想要訪問並更改 devViewNameComponent(從SmallWindow.qml)viewName的寬度。我無法訪問viewName,我不確定使用該組件是否正確。

Item 
{ 
    ... 

    //This function is called from another qml file 
    function showDetailWindow() 
    { 

    if (detailsWindow.devViewNameComponent.status == Component.Ready) 
    { 
     var compDevName = detailsWindow.devViewNameComponent.createObject(detailsWindow) 
     if (compDevName == null) { 
      console.log("Error creating object"); 
     } 

    //Here I want to access and set the viewName's width dynamically when this function is called like below 
    //Other things about statusRect and ViewName can be same. 
    //below is wrong usage (detailsWindow.devViewNameComponent.viewName) and it does not work 
     if (detailsWindow.devViewNameComponent.viewName.paintedWidth > 75)    
      detailsWindow.devViewNameComponent.viewName.width = detailsWindow.devViewNameComponent.statusRect.width *0.75;  
     else 
      detailsWindow.devViewNameComponent.viewName.width= detailsWindow.devViewNameComponent.viewNamepaintedWidth;      
    } 
} 

    SmallWindow 
    { 
     id: detailsWindow 
     visible: true; 
     ... 
    } 
} 

編輯1:我要修復的文本(ID:的viewName)的大小內側「showDetailWindow()」作爲文本的viewName的長度將被動態地改變。

正如您所見,viewName Text位於Rectangle(id:statusRect)內,並且statusRect的寬度,高度不會更改,而其顏色將根據函數calStatusColour()更改。

目前,問題是,如果viewName長度大於statusRect,並且我想縮短statusRect Rectangle寬度內的viewName文本,那麼viewName Text超出了statusRect的範圍。例如。如果文本超出了statusRect Rectangle的長度,文本需要像「NameLengthWrapped ...」一樣打包。

+0

請提供運行的小例子。 – Mitch

+0

我沒有看到執行showDetailWindow()的觸發器。如果在方法的第一行中包含console.log(「調用」),您會得到任何輸出嗎? –

+0

@Mitch:實際上,它是現有項目的一部分。因爲,我是QML的新手,我發現很難將其複製到一個小實例中。 – User1212

回答

0

我剛剛爲我的需要做了一些工作,這樣動態更改的文本將被包裹在其矩形內而不使用任何組件。

首先,我刪除了組件的東西。然後,我改變了文本(ID:的viewName),如下 調用wrapDevName()函數

Text { 
id:viewName 
... 
text: wrapDevName() 
} 

function wrapDevName() 
{ 
    if (statusText == 0) 
     return "" 
    else 
    { 
//15 is calculated by trial and error of running the application such that it does not exceed the length of its rectangle 
     var maxTextLength = statusRect.width/15 
     var devName = dev.getName() 

     if (devName.length > maxTextLength) 
      return devName.substring(0,maxTextLength) + "..." 
     else 
      return devName 
    } 
}