c++ - 如何通过在 QTableView 中排序来对 QListView 进行排序?
问题描述
我有一个 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;
}
它看起来和你所做的一样。但它有效。
推荐阅读
- javascript - 无法转换/规范化/修改 GraphQL 查询的响应 - Apollo 客户端
- python - 仅保留远距离值的有效算法
- xml - XQuery 将参数传递给函数
- sql - 计算季度开始日期
- coq - 确保两个元变量没有统一到相同的结果
- swift - Swift 4/XCode (macOS):将 IBOutlet 从 ViewController.swift 连接到 XIB 失败
- java - 如何使用 Keylistener/KeyAdapter
- javascript - Javascript:如何创建没有文本内容的按钮元素
- .net - 使用 SAFE 堆栈并仍然拥有 JSON-SPEC API 的最佳方式是什么?
- performance-testing - 如何监控安装在本地计算机上的 HP Web Tour 示例应用程序 apache 服务器的性能计数器