2017-03-15 68 views
0

我正在聊天系統上工作,我有一個會話頁面,裏面有列表視圖,列表視圖委託是文本會話。我想向會話代表添加已看到/未看到或已讀/未讀,由自定義模型生成的列表視圖,並且需要代理附加屬性等實際查看代理時發生更改的內容。有沒有附屬物告訴我每個代表物品的可見性狀態?獲取列表視圖委託的可見性狀態qml

+1

嗯,還有就是'visible'屬性,它告訴你無論是可見還是隱藏。否則,您可能需要定義自定義屬性並將其自行設置。 – DuKes0mE

+0

我查看了可見性,但當代理不完全可見時,可見性變爲true,請讓其更清楚地瞭解自定義屬性? –

+0

看看[QML屬性](http://doc.qt.io/qt-5/qtqml-syntax-objectattributes.html#property-attributes)。基本上,你可以在通常的屬性之外定義你自己的屬性。例如,你可以爲你的用例定義'property bool isRead'。爲了設置該屬性,您需要定義自己的信號處理程序,以相應地調整您的QML對象。一種方法是:使用ListView的indexAt()方法來檢測你的委託是否可見。或者使用ListView的邊界框跟蹤代表位置。 – DuKes0mE

回答

1

你有兩個問題需要解決:

  1. 如何存儲該消息已viewd
  2. 當將其設置爲讀取信息。

所以此起彼伏......

delegate內的自定義屬性沒有好主意,因爲存儲在其中的信息將會丟失,一旦delegate將離開ListView的視口,被銷燬。

最好的解決方案是將它存儲在ListView的模型中。這種方式也有可能,如果model有一定的持久性,那麼信息在應用程序重新啓動後仍然存在。
也許你可能會用下一個選項來實現我的目標,與Settings結合使用,但我會考慮這個問題。

如果這是不可能的,並且信息不需要在應用程序重新啓動時存活,則需要考慮將其存儲在ListView之外的方法。例如,您可以使用arrayobject/dictionary來存儲它(注意:無更改通知)。你也可以使用第二個ListView,你保持同步(這可能不是那麼容易!)。

最後,你可能會把你的ListView作爲一個模型在Instantiator,它實例化簡單的QtObjects與一個屬性:讀。

後者將其存儲的代表和模型之外的最簡單的方法,所以我會告訴你它是如何工作的:

Instantiator { 
    id: additionalInfo 
    model: customModel 
    delegate: QtObject { 
     property bool read  // <--- This is a custom defined property 
    } 
} 
ListView { 
    model: customModel 
    delegate: MyDelegate { 
     onRead: additionalInfo.objectAt(index).read = true 
     Text { 
      text: additionalInfo.objectAt(index).read ? 'read' : 'unread' 
     } 
    } 
} 

現在第二部分:當它實際上可以讀

您已經發現的可見性問題。 Item即使在listView之外,它們也會在buffer創建時可見。所以你不能使用這些信息。但是,你有以下信息:

  • listModel.contentItem(x和y)的位置
  • delegate的相對於listModel.contentItem
  • delegate
寬度和高度的位置

所以你可以這樣說:delegate是完全可見的iff:

  • listModel.contentItem.x + delegate.x >= 0
  • listModel.contentItem.y + delegate.y >= 0
  • listModel.contentItem.y + delegate.y + delegate.height <= listModel.height
  • listModel.contentItem.x + delegate.x + delegate.width <= listModel.width

一個例子,對如何Item會看一下它是可見的Flickable(記住:一個ListViewIS一個Flickable)可發現here

這是:如果可以讓整個代表與視圖。如果它更大 - 那麼當代表被認爲是閱讀時,你需要定義一些標準。

但同樣:如果有任何posibility把它作爲一個角色在你的model,把它放在那裏!

+0

你能解釋第二部分嗎?! –

+0

如果你告訴我,具體什麼,當然。 – derM

+0

我用你代表onYchanged提到的條件,但符合市場預期, 委託的ARE創建它沒有工作,即使他們沒有考慮到,所以我們需要檢查一些代表條件,目前都在視圖或不和也一個事件來檢查,那麼我應該使用什麼事件來正確地觸發委託組件中的列表視圖輕彈? –