QSortFilterProxyModel QTableView 5.3没有排序/更新?

时间:2014-07-28 17:16:55

标签: qt qtableview qsortfilterproxymodel

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();
}

1 个答案:

答案 0 :(得分:4)

考虑这一行:

table->setModel(bookcaseModel);

您的表似乎正在显示基础模型,而不是代理。它应该是:

table->setModel(m_proxy_bookcase);

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

而且(我可能错了)我认为在invalidate()之后调用sort()是有用的。