在QTableView中只排序一列而不排序其他列。独立专栏

时间:2017-10-27 16:47:41

标签: c++ qt

在Qt中,您可以使用QTableView来显示模型的内容,如表格。此外,您可以轻松实现排序,例如使用QSortFilterProxyModel。如果单击B列,表的行将根据B列的值进行排序。换句话说,完整的行被“移动”。

但是,我想在表中显示每列“独立”的数据。我希望能够独立地对每列进行排序。如果我点击B列,我只想对B列的内容进行排序,不要移动其他列的内容。

如何在Qt中实现?

实施例: 我有3个值集合,我在表格中显示它们:

collectionA  |   collectionB   | collectionC
     -4             10               13.5
     -7             4.5              56.2
     6                               23.0
                                     -11.4

因此,如果我点击B列,我想获得:

collectionA  |   collectionB   | collectionC
     -4             4.5               13.5
     -7             10                56.2
     6                                23.0
                                     -11.4

1 个答案:

答案 0 :(得分:1)

除非你实现这样的行为,否则用户体验会很奇怪(收集A,collectionB在将collectionC排序报告为bug时不重新排列的事实);这是问题的解决方案:

不要将tableView设置为可排序,而是在单击horizo​​ntalHeader时连接customSort函数以重新排列数据模型。当然,这个解决方案修改了数据模型而不仅仅是视图,所以如果你有这个数据模型的多个视图,它可能不适合你的需要:

文件mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHeaderView>


MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

model = std::make_unique<QStandardItemModel>(5,2);

for( int r=0; r<5; r++ )
  for( int c=0; c<2; c++)
  {
    QStandardItem *item = new QStandardItem( QString("Row:%0, Column:%1").arg(r).arg(c) );

    model->setItem(r, c, item);
  }

model->setHorizontalHeaderItem( 0, new QStandardItem( "Foo" ) );
model->setHorizontalHeaderItem( 1, new QStandardItem( "Bar-Baz" ) );


   ui->tableView->setModel(model.get());

   connect(   ui->tableView->horizontalHeader(), &QHeaderView::sectionClicked , this , &MainWindow::customSort);

}

void MainWindow::customSort( int columnIndex)
{
auto itemOfColumn = model->takeColumn(columnIndex);

//reverse the list, or whatever sorting you might want...
for(int k = 0; k < (itemOfColumn.size()/2); k++) itemOfColumn.swap(k,itemOfColumn.size()-(1+k));

model->insertColumn(columnIndex,itemOfColumn);

model->setHorizontalHeaderItem( 0, new QStandardItem( "Foo" ) );
model->setHorizontalHeaderItem( 1, new QStandardItem( "Bar-Baz" ) );

}

文件mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <memory>
#include <QStandardItemModel>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:

void customSort(int);

Ui::MainWindow *ui;

std::unique_ptr<QStandardItemModel> model;
};

#endif // MAINWINDOW_H