【发布时间】:2012-07-30 06:07:39
【问题描述】:
这是我得到的:
-
QTreeView小部件 (*); - 源模型
MainModel继承自QStandardItemModel。没有重新实现虚拟data() const方法; - 代理
MainFilterProxyModel继承自QSortFilterProxyModel;
树:
[PERIOD 1]
[CHILD 1]
[CHILD 2]
[SUBCHILD 2.1]
...
[CHILD N]
[PERIOD 2]
...
[PERIOD N]
因此,当我尝试添加类似 (**) 代码的 CHILD-row 时,主要问题就出现了。过滤器代理模型,文档添加到源模型后,不知道新行,也没有在树上显示。
我确定代理在appendRow 方法执行其工作时没有从QStandardItemModel 获得信号,因此代理无法过滤新行,也没有使其可见。
有什么帮助吗?
谢谢。
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 );
}
}
【问题讨论】:
-
在给出的示例中,您不是将项目附加到模型,而是附加到 QStandardItems,您以在示例中不可见的方式获得这些项目。你能简化你的代码,让它完全被看到并且仍然可以重现故障吗?
-
@vtmarvin 我不太明白我要做什么,但我把源文件放在这里:pastebin.com/RMLqHZhS希望有帮助!
-
好吧,如果你连MainFilterProxyModel的代码都不显示,那我们怎么看它为什么没有收到信号呢?
-
@nus 你是对的。这是代理标头(pastebin.com/pjYsLVs4)和源(pastebin.com/udTPS0c6)文件...
-
@mosg 我仍然无法按照您的程序流程进行操作,因为缺少 main-model.h。什么是模型_和代理_?他们是数据成员吗?您是否尝试将自定义代理替换为标准代理,只是为了查看错误是在您的代理中还是在您的主模型中?
标签: qt qt4 qstandarditemmodel qsortfilterproxymodel