- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我得到的:
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 );
}
}
最佳答案
建模的基类是QAbstractItemModel
。最好使用抽象类的方法来做你想做的事。 QStandardItemModel
是QAbstractItemModel
抽象方法的简单实现,大部分QStandardItemModel
新方法被重新实现的抽象函数使用。下面是使用抽象类方法添加项目和子项目的代码:
QAbstractItemModel * pModel = new QStandardItemModel(parent);
int nRows = pModel->rowCount();
pModel->insertRow(nRows); // this will emit rowsAboutToBeInserted() and rowsInserted() signals
pModel->insertColumn(0); // this will emit columnsAboutToBeInserted() and columnsInserted() signals
const QModelIndex indexFirstItem = pModel->index(nRows, 0);
pModel->setData(indexFirstItem, "Item text"); // this will emit dataChanged() signal
int nChildRows = pModel->rowCount(indexFirstItem);
pModel->insertRow(nChildRows, indexFirstItem); // this will emit rowsInserted()
pModel->insertColumn(0, indexFirstItem); // we also need to do this for the item's children
const QModelIndex indexChild = pModel->index(nChildRows, 0, indexFirstItem);
pModel->setData(indexChild, "Child item text");
如果我们尝试使用 QStandardItemModel 方法做同样的事情,它将看起来像:
QStandardItemModel *pModel = new QStandardItemModel(parent);
QStandardItem *pItem = new QStandardItem("Item text");
pItem->appendRow(new QStandardItem); // pItem is not yet added to pModel and rowsInserted won't be emitted
pModel->appendRow(pItem); // this will probably emit rowsInserted() signal but since we set tha text of the item when creating the pItem the dataChanged() signal won't be emitted.
因此,如果您执行 pItem->appendRow()
来添加子项,并且如果 pItem 尚未添加到模型中,您可能不会获得 rowsInserted()
信号,因此不会通知代理模型。根据我的经验,第一种方法效果更好并且更健壮,尽管您需要多写几行。直接使用 QStandardItemModel
方法通常会以丢失信号或其他令人头疼的问题而告终。您只需查看 QAbstractItemModel
和 QModelIndex
文档。
关于qt - QSortFilterProxyModel 与 QStandardItemModel 后 appendRow 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11757657/
我想做的:从模型中获取项目并使用排序代理按不同的角色对它们进行排序:预期输出: 实际输出包含不应该存在的空行: 您可以看到空行展开了 ListView,甚至可以通过光标进行选择。 以下是产生此错误行为
我想按日期对表格进行排序。问题是它们被解释为字符串,因此我的本地日期格式排序错误,如 26。九月 大于 16。十一月,因为 26 > 16。 无论如何,我已经建立了自己的模型并像这样尝试: QVari
我现在有点绝望。当插入到 View 中时,我的带有子类 QStirngListModel 的模型类工作得很好。当我在模型和 View 之间插入 qt 的 QSortFilterProxyModel 时
我有一个从 QAbstractListModel 继承而来的模型,它有一个 QList 来维护包含 QDateTime 的数据,该数据用于维护此列表。我必须将此数据维护一个小时,即旧数据将从列表中删除
在我的 FilterProxyModel 中,我想从我的 View 中删除第 2 列和第 5 列。所以我是这样做的 proxy_filter->removeColumns(2,1); proxy_fi
我对 Qt 中的此类对象非常缺乏经验,我需要知道是否有办法在过滤后检索数据(用于对它们执行某些操作,例如导出到另一个文件中)。 情况是这样的,我从数据库获取数据并将其存储在 python 列表中,之后
我有一个 QTableWidget,其中包含来自数据库的数据,我想实时搜索其内容(当我输入字母时,他会显示结果)?欢迎任何帮助。非常感谢。 这是我的代码: class Filter: def
QSortFilterProxyModel 似乎限制了可以在 QTableView 中显示的数据量,但仅限于应用过滤器时。似乎限制是数据大小而不是记录数,因为我可以在此处的示例中放入比我看到该行为的实
我正在使用 QSortFilterProxyModel 来过滤来自 QAbstractListModel 的结果。但是,我想返回原始模型中不存在的第一个条目,也就是说,它在某种程度上是人为的。 这是我
假设我有一个列表变量 datalist 存储 10,000 个字符串实体。QTableView 只需要显示其中的一些实体。这就是为什么 QTableView 被指定为 QSortFilterProxy
我正在尝试实现一个可在多个列上排序的表格。 Qt 的 QSortFilterProxyModel 仅支持对一列进行排序(至少在 Qt 4.6.2 中)。 我找到了 this solution由 git
我有一个 QSortFilterProxyModel 的自定义子类。我用我想要的自定义过滤器覆盖了 filterAcceptsRow。然后我这样使用它: proxy = new MyFilterMod
我正在使用继承 QSortFilterProxyModel 的类来仅对 TableView 中的行进行排序。 我启用了 dynamicSort 以确保即使在我加载模型或添加行时我的 View 也保持排
在我的项目中,我在 TreeView 中显示了一个模型。我使用 QSortFilterProxyModel 根据 Qt::UserRole+1 中设置的 ID 对模型进行排序。这将我的列表按“类型”划
我有一个包含 QTreeView 的应用程序其底层模型,比如 MyModel源自 QStandardItemModel .为了从 View 中过滤掉MyModel的一些项目, 我把它插到 QSortF
我有简单的模型 View TreeView ,带有 QSortFilterProxyModel 代理来对列进行排序,并使用 QStandardItemModel 作为模型 在每列中都有字符串排序良好,
我们有一个QSortFilterProxyModel安装在 QTableView和两个(或更多)QLineEdit用于过滤 View (基于这些 QLineEdit 的文本) 在我们看来,我们有一个槽
我有一个QDirModel,其当前目录已设置。然后我有一个 QListView ,它应该显示该目录中的文件。这工作得很好。 现在我想限制显示的文件,因此它只显示 png 文件(文件名以 .png 结尾
我有一个使用 QSortFilterProxyModel 创建表小部件的类。该类将采用字典列表作为数据,然后使用字典的键值填充表列和行。将表设置为按浮点值排序时,表中的多个字段将变得不可见。但是,当我
我正在使用 qsortfilterproxymodel 从 QstandardModel 过滤数据。我能够在我的测试应用程序中实现这个过滤过程,但是当我实时[集成]使用它时,它似乎没有按预期工作。 [
我是一名优秀的程序员,十分优秀!