2010-04-17 6 views
0

Я делаю приложение, в котором пользователь может добавлять новые данные в QTreeModel в любое время. Родитель, по которому он размещается, автоматически расширяется, чтобы показать новый элемент:Qt: Как автообновлять родителей нового элемента QTreeView при использовании QSortFilterProxyModel

self.tree = DiceModel(headers) 
self.treeView.setModel(self.tree) 
expand_node = self.tree.addRoll() 
#addRoll makes a node, adds it, and returns the (parent) note to be expanded 
self.treeView.expand(expand_node) 

Это работает по желанию. Если не добавить QSortFilterProxyModel к смешиванию:

self.tree = DiceModel(headers) 
self.sort = DiceSort(self.tree) 
self.treeView.setModel(self.sort) 
expand_node = self.tree.addRoll() 
#addRoll makes a node, adds it, and returns the (parent) note to be expanded 
self.treeView.expand(expand_node) 

родитель больше не расширяется. Любая идея, что я делаю неправильно?

ответ

2

Я считаю, что вы должны сопоставить свой индекс расширяемого элемента с индексом элемента прокси-модели, прежде чем вызывать его расширение. QSortFilterProxyModel::mapFromSource метод должен делать то, что вам нужно. Пожалуйста, проверьте, если ниже пример будет работать для вас (это C++, дайте мне знать, если у вас возникли проблемы, преобразовав его в Python):

// create models 
QStandardItemModel* model = new (QStandardItemModel); 
QSortFilterProxyModel* proxyModel = new QSortFilterProxyModel(this); 
proxyModel->setSourceModel(model); 

// set model 
ui->treeView->setModel(proxyModel); 
ui->treeView->setSortingEnabled(true); 

// generate items 
QStandardItem* parentItem0 = model->invisibleRootItem(); 
QModelIndex index = parentItem0->index(); 
for (int i = 0; i < 4; ++i) 
{ 
    QStandardItem* item = new QStandardItem(QString("new item %0").arg(i)); 
    parentItem0->appendRow(item); 
    parentItem0 = item; 

    // expand items using proxyModel->mapFromSource 
    ui->treeView->expand(proxyModel->mapFromSource(item->index())); 
    // line below doesn't work for you 
    //ui->treeView->expand(item->index()); 
} 

надеюсь, что это помогает, считает

Смежные вопросы