2016-10-17 64 views
0

我有一個包含窗口我所說的頁面 - 一個矩形,在主窗口的大小:QML不能掩蓋矩形

LoginWindow { 
    id: loginWindow 
} 

SelectionWindow { 
    id: selectionWindow 
} 

ServiceWindow { 
    id: serviceWindow 
} 

ConfirmWindow { 
    id: confirmWindow 
} 

IssueWindow { 
    id: issueWindow 
} 

每個*這裏窗口從頁面繼承的元素。

現在我可以在設置其可見性的不同頁面元素之間跳轉。一次只能看到一個頁面。最後一頁是IssueWindow,從那裏我想切換回LoginWindow並註銷用戶。

從C++我發出issueFinished的信號,並在主窗口我有這樣的代碼:

onIssueFinished: { 
     // This line won't hide the Page 
     issueWindow.visible = false; 

     loginHandle.logout(); 
    } 

正如評論指出的那樣,頁面元素是不會隱瞞的,而其他的元素會改變他們的知名度。我正在使用GammaRay來查看更改,並且所有的工作都正常,只是隱藏了問題窗口沒有。當打印issueWindow.visible到控制檯時,它也是錯誤的。

+0

你爲什麼不使用'Loader'? – user2436719

+0

@ user2436719:加載器會殺死實例。然而,保留這些實例可能是必要的,因爲沒有無狀態的觀點,或者複雜的觀點需要很長時間來重新證實。如果手頭有足夠的內存,如果您不必等到每次切換時都重新生成一個頁面,就會給出更多的反應。 – derM

回答

0

發現問題實際上是切換可視性和觸發信號並對其做出響應的錯誤順序。

0

使用opacity代替可見性,並綁定一個處理啓用和禁用狀態的不透明度更改方法。

onIssueFinished: { 
     // This line won't hide the Page 
     issueWindow.opacity = 0.0; 

     loginHandle.logout(); 
    } 

IssueWindow { 
    id: issueWindow 

    onOpacityChanged: { 
     enabled = (opacity === 1.0) 
    } 
} 

您需要在所有窗口中實現不透明度更改。 並設置所有其他窗口的不透明度。您可以使用stack viewswipe view

+0

感謝您的回答,但這並沒有解決問題。使用不透明度比可見性有什麼好處? –

+0

更糟的表現......但你可以有平穩的過渡。 – derM

0

要確保只有一個頁面可見,您可以使用索引。 您的可見性設置爲:

visible: (selected == thisPageIdentifier) 

有了這個,你要確保,只有具有相應pageIdentifyer的頁面是可見的,你不必到處亂扔多個信號顯示和隱藏。
當新頁面變爲可見時,只需將selected屬性設置爲相應的標識符(int或字符串或以前的內容),其他頁面將不可見。
這應該會增加可伸縮性,因爲如果您決定添加一次新頁面,則在所有其他頁面中都沒有新的信號可處理。您只需確保標識符是唯一的。調整到這種

您的示例代碼:

Item { 
    property int selection: 0 
    LoginWindow { 
     id: loginWindow 
     visible: (selection === 0) 
    } 

    SelectionWindow { 
     id: selectionWindow 
     visible: (selection === 1) 
    } 

    ServiceWindow { 
     id: serviceWindow 
     visible: (selection === 2) 
    } 

    ConfirmWindow { 
     id: confirmWindow 
     visible: (selection === 3) 
    } 

    IssueWindow { 
     id: issueWindow 
     visible: (selection === 4) 
    } 
}