這裏什麼我有:QSortFilterProxyModel與QStandardItemModel後appendRow不工作
- 一個
QTreeView
部件(*); - 源模型
MainModel
從QStandardItemModel
繼承。沒有虛擬data() const
方法重新實現; - 代理
MainFilterProxyModel
從QSortFilterProxyModel
繼承;
樹:
[PERIOD 1]
[CHILD 1]
[CHILD 2]
[SUBCHILD 2.1]
...
[CHILD N]
[PERIOD 2]
...
[PERIOD N]
所以主要的問題是當我嘗試添加兒童行像(**)的代碼做。過濾器代理模型在將文檔添加到源模型後,不知道有關新行,並且沒有在樹上顯示它。
我確定當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。你能否簡化你的代碼,使它看起來完全並且仍然是可重現的故障? – 2012-08-01 15:34:41
@vtmarvin我真的不明白我必須做什麼,但我把源文件放在這裏:http://pastebin.com/RMLqHZhS希望有所幫助! – mosg 2012-08-01 16:00:50
好吧,如果你甚至不顯示MainFilterProxyModel的代碼,我們應該怎麼看它爲什麼沒有得到信號? – nus 2012-08-04 03:12:11