2017-04-25 92 views
0

我的QML ListView直到我用鼠標干擾它時才顯示我的數據(,例如只是將它上下拖動)。之後,視圖顯示模型,直到它清空,然後那麼我再一次需要擾亂它才能重新運作。有沒有辦法踢這個ListView進入工作?ListView最初沒有顯示數據

我在Linux 14.04上使用Qt 5.8。我的模型是QAbstractListModel的子類。我通過遵循AbstractItemModel Example來構建它。主要區別在於我的列表模型是實體的屬性,而不是在中使用setContextProperty進行設置。

在SO上有幾個類似的問題,關於ListView沒有更新,但沒有一個在開始時似乎只有一個問題。他們中的大多數涉及到OP調用dataChanged手動,而不是beforeInsertRows() & endInsertRows() - 這兩種方法我打電話(見下文)。

ListView是裝載了SceneLoader項目。

posted all the relevant code here,因爲我是有點懷疑的我如何使用佈局上我ListView(也許這就是造成的呢?也許我的等級制度被打破?我一直沒能證明,雖然)。

總之,雖然,

的ListView

ListView { 
    anchors.fill: parent 
    model: sceneGraph.blobs 
    delegate: delegate 
} 

BlobModel.cpp

auto BlobModel::addBlob(const BlobPointDataPtr& data) -> void 
{ 
    // ... 

    // Each blob has a uuid 

    const auto idx = Contains(uuid); 
    if (-1 != idx) 
    { 
     blobs_[idx]->Update(data); 
     Q_EMIT dataChanged(createIndex(idx, 0), createIndex(idx, 0)); 
    } 
    else 
    { 
     beginInsertRows(QModelIndex(), rowCount(), rowCount()); 
     blobs_ << new Blob{data, id_count_}; id_count_++; 
     endInsertRows(); // responsible for the QQmlChangeSet 

     Q_EMIT dataChanged(createIndex(rowCount(), 0), createIndex(rowCount(), 0)); 
    } 
} 

而且,我的終端上,我收到消息:

QObject::connect: Cannot queue arguments of type 'QQmlChangeSet' 
(Make sure 'QQmlChangeSet' is registered using qRegisterMetaType().) 

這似乎是由endInsertRows()發出,但我不知道爲什麼。過去,解決方案是登記丟失的類型,例如,例如qRegisterMetaType<QQmlChangeSet*>("QQmlChangeSet");但是這似乎不是一個Qt的公共類型,並且因爲所有東西都是沒有它的,所以我不確定這是不是確切的問題。

+1

我已經盡你所能地測試了你的代碼。爲了簡單起見,我用QStrings替換了Blob對象。我完全按照AbstractItemModel示例所做的那樣創建了addBlob()。它爲我工作得很好。 [Code Here](https://gist.github.com/anonymous/1a41d90c212c73086fe81c41374b9661) –

+0

你是如何填充模型的?我發現如果模型中存在初始數據,它就可以正常工作,問題只有在模型是空的時候纔會起作用(所以在啓動時或模型清空時)。感謝您查看它,我會嘗試實際創建一個完整的最小例子,然後我會用你的例子中的字符串來嘗試它,看看是否有任何區別。 – Matt

+0

嗯,我只是建立了一個[最小的可編譯示例](https://github.com/kheaactua/listview_issue/tree/master/listview_issue),它也可以。在早上,我會再添加一點,使其更接近我的原始代碼,以查看問題開始的位置(然後刪除此評論) – Matt

回答

0

正如在評論中指出的那樣,問題是我在主線程之外修改我的模型。

我的代碼已設置,以便另一個線程通過直接調用addData來觸發對我的模型的添加。我最小的例子無法複製這個的原因是因爲在其中我使用QTimer來模擬其他線程,但QTimer也運行在主線程上。

解決方法是將我的直接調用改爲addData(data)以發出信號以進行添加,從而將實際工作移回主線程。