在开发中,有个一需求,一个QTableWidget表格,表头只允许一行可以点击排序,并只有这一行可以显示上下箭头(排序)。
如下图,只有质检状态可以点击排序,并显示上面的箭头。
这个时候我们该怎么做呢?查帮助文档吧,帮助文档确实有可以实现点击表头可以排序并显示排序的箭头的。
void setSortIndicatorShown(bool show)
当show为ture的时候,就可以实现可以点击表头实现排序。但是有个问题:这个函数是对所有列有效的,就是说,你点击任何一列的时候,都可以实现排序(显示箭头)。和我们的需求有点不太一样,怎么办,继续找方法吧。
这时候我们发现一个信号
[signal] void QHeaderView::sectionClicked(int logicalIndex)
也就是说当我们鼠标点击表头的时候,是会出发这个信号的,其中logicalIndex为点击的第几列,这样我们就有了思路:
1.我们连接点击表头点击的信号到我们自定义的一个槽函数
connect(ui->tableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(slotHeaderClicked(int)));
2.在槽函数里我们来判断,点击的是第几列的表头。当我们发现点击的是我们想要的排序的列的时候,我们就可以设置刚开始我们找到的setSortIndicatorShown(true),然后设置箭头的方向,再排序。如果点击的不是我们想要的那一列,就setSortIndicatorShown(false),然后直接return就可以了。
void TableForm::slotHeaderClicked(int index)
{
if (index != 6)
{
//不是我们想要的那一列
ui->tableWidget->horizontalHeader()->setSortIndicatorShown(false);
return;
}
static bool bSortAsc = true;
Qt::SortOrder order = bSortAsc ? (Qt::AscendingOrder) : (Qt::DescendingOrder);
ui->tableWidget->horizontalHeader()->setSortIndicatorShown(true);
ui->tableWidget->horizontalHeader()->setSortIndicator(index, order);
QString strSort = bSortAsc ? "asc" : "desc";
requestQcList(m_nCurrentPageIndex, strSort);
bSortAsc = !bSortAsc;
}