Как отсортировать QListView путем сортировки в QTableView? - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть QListView и QTableView, совместно использующие подкласс QSortFilterProxyModel поверх пользовательской исходной модели.Сортировка включена в QTableView, как разделить один и тот же результат сортировки между двумя представлениями?

Реализовать ли я функцию sort () или lessThan () функции QSortFilterProxyModel?Если да, то как мне их переопределить?

В настоящее время это мой код, и он не работает:

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.

1 Ответ

0 голосов
/ 25 декабря 2018

меня интересовал вопрос.Поэтому я создал пустой проект с графическим интерфейсом и реализовал что-то вроде вашего первого примера.Кажется, мой код делает то, что вы хотите.Когда я щелкаю заголовок таблицы, QListView элементы возвращаются.

Вы можете попробовать

mainwindow.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;
};

mainwindow.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;
}

Выглядит так жечто ты сделал.Но это работает.

...