Qt助手的解释
If enable is true, enables sorting for the table and immediately trigger a call to sortByColumn() with the current sort section and order
Note: Setter function for property sortingEnabled.
如果将 enable 设置为 true 那么就会立即调用 sortByColumn() 参数是当前所在的列和顺序。那么对于一个没有设置的QTableWidget来说当前所在的顺序是什么呐?
查看源码可以得到
void QTreeView::setSortingEnabled(bool enable)
{
Q_D(QTreeView);
header()->setSortIndicatorShown(enable);
header()->setSectionsClickable(enable);
if (enable) {
//sortByColumn has to be called before we connect or set the sortingEnabled flag
// because otherwise it will not call sort on the model.
sortByColumn(header()->sortIndicatorSection(), header()->sortIndicatorOrder());
connect(header(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)),
this, SLOT(_q_sortIndicatorChanged(int,Qt::SortOrder)), Qt::UniqueConnection);
} else {
disconnect(header(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)),
this, SLOT(_q_sortIndicatorChanged(int,Qt::SortOrder)));
}
d->sortingEnabled = enable;
}
setSortingEnabled 一共做了四件事,假设传入的 enable 为 true。
- 表头显示排序的指示符
- 设置表头每节可以被点击
- sortByColumn(); 可以查阅助手得知 默认的 sortIndicatorSect ion 是 0,默认的 sortIndicatorOrder
应该是从小到大
注意: 在将 setSortingEnabled 为true后。排序就立刻生效了,在之后插入的每一项都将遵循排序的规则,所以一般建议是在一个表格插入完成后才将 setSortingEnabled 进行设置。在点击表头进行升序或者降序时,会根据设置 item 传入的是 字符串 还是数字进行排序。在很多时候我们往往希望是按照数字的升序或者降序进行排序的
例子
有一个表格,表头分别是 姓名 编号 成绩。我们希望是 表格初始化时 是按照编号进行升序排序。用户可以点击表头指定按照某一列进行升序或者降序排列
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QStringList headers;
headers << QStringLiteral("编号") << QStringLiteral("姓名") << QStringLiteral("成绩");
ui->tableWidget->setHorizontalHeaderLabels(headers);
ui->tableWidget->setRowCount(6);
ui->tableWidget->setColumnCount(3);
QTableWidgetItem *item0_0 = new QTableWidgetItem(QStringLiteral("小明"));
QTableWidgetItem *item0_1 = new QTableWidgetItem(QStringLiteral("杰哥"));
QTableWidgetItem *item0_2 = new QTableWidgetItem(QStringLiteral("老王"));
QTableWidgetItem *item0_3 = new QTableWidgetItem(QStringLiteral("刘峰"));
QTableWidgetItem *item0_4 = new QTableWidgetItem(QStringLiteral("城楼"));
QTableWidgetItem *item0_5 = new QTableWidgetItem(QStringLiteral("二爷"));
QList<QTableWidgetItem*> list({item0_0, item0_1, item0_2, item0_3, item0_4, item0_5});
for(int i = 0; i < 6; ++i){
ui->tableWidget->setItem(i, 0, list.at(i));
}
unsigned int seed = std::chrono::system_clock::now().time_since_epoch().count();
std::default_random_engine engine(seed);
std::uniform_int_distribution<int> distribution(0, 100);
//因为我们希望是按照编号的数字来进行升序或者降序排布,所以这里要使用 setData() 接口
for(int i = 0; i < 6; ++i){
QTableWidgetItem *item = new QTableWidgetItem;
item->setData(Qt::DisplayRole, i + 1);
ui->tableWidget->setItem(i, 1, item);
}
for(int i = 0; i < 6; ++i){
QTableWidgetItem *item = new QTableWidgetItem;
item->setData(Qt::DisplayRole, distribution(engine));
ui->tableWidget->setItem(i, 2, item);
}
//要插入完成后才设置该属性,因为默认情况下会根据第一列进行升序排序。这不是我们期望的
//当然也可以修改默认要进行排序的列
ui->tableWidget->setSortingEnabled(true);
}