[英]QT: Searching through QTreeView/QFileSystemModel with a QDtring for a QModelIndex index
我正在為用戶選擇一個自定義QDialog
,以選擇文件系統上的目錄。 我在QFIleSystemModel
使用QTreeView
。 每當用戶在QTreeView
選擇一個項目時,該目錄就會寫入QLineEdit
。 我的問題是,我想通過采用鍵入的文本擴展QTreeView
節點來做相反的排序,如果...顯然,如果鍵入的文本是現有的絕對路徑,則可以擴展節點。
我已經搜索了很多我的問題的變體(盡管我知道它的負載非常大),並且瀏覽了很多有關類的文檔,但是找不到任何真正可以幫助我的東西。 我猜我發現后需要使用QTreeView::expand(const QModelIndex)
來擴展它們,但是QTreeView::expand(const QModelIndex)
搜索索引是我最大的問題。 我願意征求任何建議,我們將不勝感激。 在此先感謝您,並很抱歉在此文字牆。
到目前為止,搜索索引是我最大的問題
索引只是模型中項目的“指針”。 您無法通過它進行搜索,因為索引中沒有任何內容。 它只是指向一個項目的指針。
您應該搜索模型 。 index(const QString & path)
方法為您做到了。 給定路徑,它將在路徑末尾返回元素的索引。 然后,您可以向上迭代以擴展項目:
// ...because QModelIndex::operator= doesn't exist
QModelIndex & assign(QModelIndex & dst, const QModelIndex & src) {
dst.~QModelIndex();
new (&dst) QModelIndex(src);
return dst;
}
void extend(const QString & path, QTreeView * view) {
auto fs = qobject_cast<QFileSystemModel*>(view->model());
if (!fs) return;
auto idx = fs->index(path);
// ascend up from the child item and expand items in the tree
while (idx.isValid()) {
view->expand(idx);
assign(idx, idx.parent());
}
}
您也可以在從路徑中刪除最后一項的情況下使用此方法,因為-大概-最后一項可能無效,因此fs->index
可能會失敗。
你在這里檢查嗎?
[模型/視圖編程] [在QTreeView中插入和刪除行]
http://doc.qt.io/qt-4.8/model-view-programming.html QTreeView&QAbstractItemModel&insertRow
作為基本設計原則,View僅呈現數據。不要期望直接通過View修改數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.