QTableWidget setSortingEnable 函数使用详解

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。

  1. 表头显示排序的指示符
  2. 设置表头每节可以被点击
  3. 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);
}

你可能感兴趣的:(我的QT,qt)