QSortFilterProxyModel QTableView 5.3无法排序/更新?

3

Qt 5.3.0 & 5.3.1 Linux

我已经子类化了QSortFilterProxyModel并实现了lessThan()方法。当有人单击我连接到表格视图标题的时候,我会调用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();
}
1个回答

4

考虑以下代码:

table->setModel(bookcaseModel);

看起来你的表格显示的是底层模型,而不是代理。应该是这样的:

table->setModel(m_proxy_bookcase);

使用代理对模型进行排序时,它不会修改源模型;只有代理在调用sort()后才知道元素的顺序。这就是为什么您的视图必须显示代理而不是源模型的原因。
而且(我可能错了),我认为在sort()之后调用invalidate()没有用处。

太棒了,就是这个!我简直不敢相信我错过了它。谢谢你! - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接