2013-03-09 79 views
3

我想通过动态填充QtQuick 2.0(Qt 5)中的ListModel填充GridView。 它可以工作,但应用程序启动非常缓慢:当动态填充GridView时启动缓慢的应用程序

应用程序窗口立即显示,但lightblue背景显示需要约2秒。在此之前,我看到一个默认的灰色背景。

如果我取消注释下面评论的两行,应用程序立即启动。但我不喜欢这种黑客攻击,因为我不明白它为什么起作用。

有谁知道什么可能是错的?

谢谢!

import QtQuick 2.0 

Rectangle { 
    width: 1024; height: 600 
    color: "lightblue" 

    Component.onCompleted: { 
     //moviesModel.clear() 
     moviesModel.append({ "movieNumber": 1 }) 
    } 

    ListModel { 
     id: moviesModel 
     //ListElement { movieNumber: 0 } 
    } 

    Component { 
     id: moviesComponent 
     Rectangle { 
      width: grid.cellWidth 
      height: grid.cellHeight 
      Text { 
       anchors.centerIn: parent 
       text: movieNumber 
      } 
     } 
    } 

    GridView { 
     id: grid 
     anchors.fill: parent 
     cellWidth: 100 
     cellHeight: 200 

     model: moviesModel 
     delegate: moviesComponent 
    } 
} 
+0

你如何填充你的模型?通过多次“append”调用? – 2013-03-10 04:57:35

+0

是的,但即使只有一个追加电话,它也会被复制,正如上面的代码一样。要重现,请创建一个新的QtQuick 2.0项目并将代码复制粘贴到main.qml中。 – Zmey 2013-03-10 21:08:00

回答

0

这似乎是一个有争议的问题。您的代码与未注释的行创建一个列表模型与一个元素。您的onCompleted然后删除列表中的所有内容并添加一个新元素。看起来你应该有一个在QML中定义的静态ListModel,或者你应该在启动时有一个空的列表模型。

每当您更改ListModel并且它具有可见的元素时,就会发生许多事情。 ListModel需要更新其内部结构,然后表明它已经改变。然后,您的网格视图需要通过委托呈现可见的ListElements。这可能是两个非常快速的变化(明确和追加)的行为。哪两个都需要在每个操作之后执行所有这些操作,启动时太多了。记住,你只有一个可用于gui的线程。

+0

奇怪的是,我的代码中未加注释的行可正常工作。所以这与看起来合乎逻辑的事情完全相反。 :) – Zmey 2013-03-23 23:19:37