这是我得到的:
- 一个
QTreeView
小部件(*); - 源模型
MainModel
继承自QStandardItemModel
. 没有重新实现虚data() const
方法; - 代理
MainFilterProxyModel
继承自QSortFilterProxyModel
;
那个树:
[PERIOD 1]
[CHILD 1]
[CHILD 2]
[SUBCHILD 2.1]
...
[CHILD N]
[PERIOD 2]
...
[PERIOD N]
所以主要问题是当我试图添加一个像 (**) 代码那样的CHILD-row时。过滤器代理模型,在文档被添加到源模型后,不知道新行,也没有在树上显示。
我确定代理在方法完成工作QStandardItemModel
时没有收到信号appendRow
,因此代理无法过滤新行,也没有使其可见。
有什么帮助吗?
谢谢。
PS:如果我关闭代理,一切都很好。但问题不在于代理。代理只是没有得到关于附加到主源模型的新行的信号......
(*)这里是QTreeView
:
MainView::MainView( QWidget* parent /* = 0 */ ) : QTreeView( parent )
{
if( !model_ )
{
model_ = new MainModel( this );
}
if( !proxy_ )
{
proxy_ = new MainFilterProxyModel( this );
proxy_->setDynamicSortFilter( true );
proxy_->setSourceModel( model_ );
setModel( proxy_ );
}
}
(**)这是我的附加功能:
void MainModel::addRow( const DocumentPtr& document, QStandardItem* parentItem )
{
assert( document );
QList< QStandardItem* > items;
items << ( new QStandardItem );
items << ( new QStandardItem );
items << ( new QStandardItem );
items << ( new QStandardItem );
items << ( new QStandardItem );
items << ( new QStandardItem );
items << ( new QStandardItem );
updateRow( document, items );
if( !parentItem )
{
BOOST_FOREACH( const TimePeriod& period, TimePeriod::all() )
{
if( period.contains( QDateTime::fromTime_t( document->creationDate() ) ) )
{
QStandardItem* periodItem = itemByPeriod( period );
Q_ASSERT( periodItem );
periodItem->appendRow( items );
break;
}
}
}
else
{
parentItem->appendRow( items );
}
}