在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
答案 0 :(得分:1)
除非你实现这样的行为,否则用户体验会很奇怪(收集A,collectionB在将collectionC排序报告为bug时不重新排列的事实);这是问题的解决方案:
不要将tableView设置为可排序,而是在单击horizontalHeader时连接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