如何通过在QTableView中排序来对QListView进行排序

How to sort a QListView by sorting in QTableView?

本文关键字:排序 QListView QTableView 何通过      更新时间:2023-10-16

我有一个QListView和QTableView,它们在自定义源模型之上共享一个子类化的QSortFilterProxyModel。QTableView开启了排序,如何在两个视图之间共享相同的排序结果?

我是否重新实现 QSortFilterProxyModel 的 sort() 或 lessThan() 函数?如果是这样,我应该如何重新实现它们?

这目前是我的代码,它不起作用:

MyModel *model = new QMyModel();
MySortFilterModel *proxy_model = new MySortFilterModel();
proxy_model->setSourceModel(model);
proxy_model->setDynamicSortFilter(true);
QListView *list = new QListView();
list->setModel(proxy_model);
QTableView *table = new QTableView();
table->setModel(proxy_model);
table->setSortingEnabled(true);

我还尝试了以下方法:

QHeaderView *header = table->horizontalHeader();
header->setSortIndicator(0, Qt::AscendingOrder);
header->setSortIndicatorShown(true);
header->setSectionsClickable(true);
connect(header,SIGNAL(sectionClicked(int)),table,SLOT(sortByColumn(int)));

但是当我通过单击标题对表格进行排序时,表格会更新,但列表不会更新,两个视图在不同的行都有不同的项目。

我希望得到一个结果,当用户单击 QTableView 的水平标题时,项目数据被排序,同时在 QListView 中共享的相同项目数据也被排序。

我对这个问题很感兴趣。所以我创建了一个空的 GUI 项目,并实现了类似于您的第一个示例的东西。似乎我的代码可以做你想要的。当我单击表标题时,QListView

你可以试试

主窗口.h

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    void mySetupUi();
    Ui::MainWindow *ui;
    QSortFilterProxyModel *proxyModel;
    QStandardItemModel *sourceModel;
    QTableView *tableView;
    QListView *listView;
};

主窗口.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    proxyModel(new QSortFilterProxyModel(this)),
    tableView(new QTableView(this)),
    listView(new QListView(this))
{
    ui->setupUi(this);
    sourceModel = getModel();
    // set source model for proxy
    proxyModel->setSourceModel(sourceModel);
    tableView->setSortingEnabled(true);
    // set proxy model for views
    tableView->setModel(proxyModel);
    listView->setModel(proxyModel);
    mySetupUi();
}
void MainWindow::mySetupUi()
{
    tableView->move(10, 15);
    listView->move(300, 15);
    tableView->adjustSize();
    listView->adjustSize();
    tableView->raise();
    listView->raise();
}

模型初始化(你可以把它放在主窗口构造函数附近):

QStandardItemModel* getModel()
{
    QStandardItemModel *model = new QStandardItemModel();
    model->setItem(0, 0, new QStandardItem("Alex"));
    model->setItem(0, 1, new QStandardItem("Brown"));
    model->setItem(0, 2, new QStandardItem("24"));
    model->setItem(1, 0, new QStandardItem("Mike"));
    model->setItem(1, 1, new QStandardItem("White"));
    model->setItem(1, 2, new QStandardItem("19"));
    model->setItem(2, 0, new QStandardItem("Ben"));
    model->setItem(2, 1, new QStandardItem("Black"));
    model->setItem(2, 2, new QStandardItem("22"));
    return model;
}

看起来和你所做的一样。但它有效。