Qt 5.3.0& 5.3.1 Linux
我已经将QSortFilterProxyModel子类化并实现了lessThan()。 当有人点击tableview标题时(我已将其连接到) 我打电话给invalidate(),我看到它打电话' lessThan'但桌面视图永远不会 更新。谁能告诉我我失踪了什么? lessThan()绝对是 正确排序事物,因为我放了一些打印语句来查看是什么 当它被召唤时发生在那里。我也尝试过添加 table-> repaint(),它没有做任何事情。
这是我的代码:
QTableView *table = m_ui->tableView;
table->resize(930, 200);
table->setAlternatingRowColors(true);
table->setSelectionMode(QAbstractItemView::SingleSelection);
table->setSelectionBehavior(QAbstractItemView::SelectRows);
table->verticalHeader()->hide();
QStringList header;
header << "ID";
header << "Prefix";
header << "First";
header << "M";
header << "Last";
int cols = header.size();
BookcaseModel *bookcaseModel = new BookcaseModel(this, cols, header);
m_proxy_bookcase = new SortFilterProxyModelBookcase(this);
m_proxy_bookcase->setSourceModel(bookcaseModel);
m_proxy_bookcase->sort(0, Qt::AscendingOrder);
m_proxy_bookcase->setDynamicSortFilter(true);
m_proxy_bookcase->setSortRole(Qt::DisplayRole);
table->setModel(bookcaseModel);
table->setSortingEnabled(true);
table->horizontalHeader()->setSortIndicator(0, Qt::AscendingOrder);
table->horizontalHeader()->setSectionsClickable(true);
connect(table->horizontalHeader(), SIGNAL(sectionClicked(int)),
this, SLOT(selectedColumnSlot(int)));
然后是插槽:
void selectedColumnSlot(int col)
{
m_proxy_bookcase->sort(col, Qt::DescendingOrder);
m_proxy_bookcase->invalidate();
}
答案 0 :(得分:4)
考虑这一行:
table->setModel(bookcaseModel);
您的表似乎正在显示基础模型,而不是代理。它应该是:
table->setModel(m_proxy_bookcase);
使用代理对模型进行排序时,它不会修改源模型;在调用sort()
之后,只有代理知道元素的顺序。这就是为什么您的视图必须显示代理而不是源模型的原因。
而且(我可能错了)我认为在invalidate()
之后调用sort()
是有用的。