2017-04-12 47 views
4

我有一個Loader對象,加載一些非常隆起的組件。某些事件在負載的中間到達,需要加載停止並返回以清空Loader。可能嗎?如何在加載器中取消加載組件?

+0

應該是,與'異步'裝載機。但是這個屬性讓我失望了。儘管'UI'沒有按照承諾('BusyIndi​​cator'運行)凍結,但它仍然完全沒有響應。 – derM

+0

我有'異步'設置,但問題是它在裝載程序沒有完成加載時會破壞對象,這會導致警告和錯誤。 –

+0

將'active'設置爲false或將'source' /'sourceComponent'設置爲null會怎樣? – folibis

回答

6

中止對象創建

作爲記錄由Qt中,三種方法存在卸載/中止的對象實例化:

  1. 設置Loader.activefalse
  2. 設置Loader.source爲空字符串
  3. 設置Loader.sourceComponentundefined

異步行爲

爲了能夠裝載過程中改變這些屬性, Loader.asynchronous應該是true,否則GUI線程正忙於加載對象。您還需要QQmlIncubationController以便您的QQmlEngine控制用於對象孵化的空閒時間。沒有這樣的控制器Loader.asynchronous不起任何作用。請注意,如果場景包含QQuickWindowQQmlApplicationEngine會自動安裝默認控制器。

蟲蟲

直到最後測試Qt的版本(Qt的5.8.0,5.9.0測試版),嚴重的存儲器中止未完成的對象孵育(至少在某些情況下,當包括泄漏存在例如在derM的答案中)導致大型組件快速的內存使用增加。 A bug report創建包括一個建議的解決方案。

2

我不知道你的issu是什麼,那些對象在加載器完成之前銷燬,但也許問題出在那裏?如果沒有,這應該工作: 如果它沒有幫助,請添加一些代碼到您的問題,這再現了您的問題。

main.qml

import QtQuick 2.7 
import QtQuick.Controls 2.0 

ApplicationWindow { 
    id: root 
    visible: true 
    width: 400; height: 450 

    Button { 
     text: (complexLoader.active ? 'Loading' : 'Unloading') 
     onClicked: complexLoader.active = !complexLoader.active 
    } 

    Loader { 
     id: complexLoader 
     y: 50 
     width: 400 
     height: 400 
     source: 'ComplexComponent.qml' 
     asynchronous: true 
     active: false 
     // visible: status === 1 
    } 

    BusyIndicator { 
     anchors.fill: complexLoader 
     running: complexLoader.status === 2 
     visible: running 
    } 
} 

ComplexComponent.qml

import QtQuick 2.0 

Rectangle { 
    id: root 
    width: 400 
    height: 400 
    Grid { 
     id: grid 
     anchors.fill: parent 
     rows: 50 
     columns: 50 
     Repeater { 
      model: parent.rows * parent.columns 
      delegate: Rectangle { 
       width: root.width/grid.columns 
       height: root.height/grid.rows 
       color: Qt.rgba(Math.random(index), 
           Math.random(index), 
           Math.random(index), 
           Math.random(index)) 
      } 
     } 
    } 
} 
+0

如果你保持點擊按鈕的速度非常快,它永遠不會釋放爲以前的對象分配的內存,並最終導致bad_alloc。 –

+0

你多久點擊一次我的'ComplexComponent'? :D我選擇了一個計時器*每200或500毫秒點擊一次*,並在多分鐘內完成。但是,是的,內存隨着時間的推移而增加... – derM

+0

我將計時器設置爲200,但將行數和列數增加到200.它增長內存速度非常快,並且崩潰。 –