1

情况

我有一个单一的 Qt 模型,特别是一个从 QStringListModel 派生的 StringModel,称为“模型”。

我有三个视图,特别是三个 QListView,分别称为“listView_1”、“listView_2”和“listView_3”。

所有这三个 QListViews 都设置为一个模型,即:

(ui->listView_1)->setModel(model);
(ui->listView_2)->setModel(model);
(ui->listView_3)->setModel(model);

并发症

虽然我希望所有三个视图都引用同一个模型,但它们从该模型显示的数据应该略有不同。模型中规定视图中显示哪些数据的函数是从 QStringListModel 继承的“数据”成员函数,定义为:

QVariant StringModel::data(const QModelIndex &index, int role) const
{
        if (!index.isValid()){
            return QVariant();
        }
        if (role == Qt::DisplayRole)
        {
            int col = index.column();
            int row = index.row();
            if (col == 0){
                QList<Contact*> list = contactList.findChildren<Contact*>();
                return list.at(row)->toString();//<<THIS STATEMENT MUST BE VARIABLE
            }
        }
        QVariant v;
        return v;
}

上面代码中的第 12 行返回要在视图上显示的数据,这就是我想根据视图改变的返回语句。

问题

模型视图控制器最佳实践表明我们应该能够保持模型不变并通过细微的调整来更改视图。因此,如果不为 3 个视图定义 3 个模型,我将如何调整我的数据函数以根据设置的视图返回不同的语句?或者,用一句话总结,我如何根据设置的视图调整模型?

4

1 回答 1

2

对于我建议的简单用例,您使用QIdentityProxyModel. 下面是一个带有两个视图的小示例,其中一个视图以相反的顺序显示字符串。

您必须仔细考虑这两个角色Qt::ItemDataRole::EditRoleQt::ItemDataRole::DisplayRole使其工作看起来很顺畅。

主文件

#include <cmath>
#include <QApplication>
#include <QHBoxLayout>
#include <QStandardItemModel>
#include "ReverseModel.h"
#include <QListView>
#include <QFrame>

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);
    auto frame = new QFrame;
    auto model = new QStandardItemModel;
    auto view1 = new QListView;
    auto view2 = new QListView;
    view1->setModel(model);
    auto reverseModel = new ReverseModel;
    reverseModel->setSourceModel(model);
    view2->setModel(reverseModel);
    frame->setLayout(new QHBoxLayout);
    frame->layout()->addWidget(view1);
    frame->layout()->addWidget(view2);
    model->appendRow(new QStandardItem("Test"));
    frame->show();
    return a.exec();
}

逆向模型.h

#pragma once

#include <QIdentityProxyModel>
#include <algorithm>

class ReverseModel : public QIdentityProxyModel {
    Q_OBJECT
public: 
    QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override {
        if (role == Qt::DisplayRole || role==Qt::EditRole) {
            auto data = QIdentityProxyModel::data(index);
            auto string = data.toString();
            std::reverse(string.begin(), string.end());
            return string;
        }
        else {
            return QIdentityProxyModel::data(index, role);
        }

    }

    bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override {
        if (role == Qt::EditRole ) {
            auto string = value.toString();
            std::reverse(string.begin(), string.end());
            QVariant reversedValue =string;
            return QIdentityProxyModel::setData(index, reversedValue, role);
        }
        else {
            return QIdentityProxyModel::setData(index, value, role);
        }
    }
};
于 2019-09-13T06:06:11.633 回答