gpt4 book ai didi

c++ - 如何根据设置的 View 调整模型?

转载 作者:行者123 更新时间:2023-11-30 03:14:19 24 4
gpt4 key购买 nike

情况

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

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

这三个QListView都设置为一个模型,即:

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

并发症

虽然我希望所有三个 View 都引用同一模型,但它们从该模型显示的数据应该略有不同。模型中指示在 View 中显示哪些数据的函数是从 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 行返回要在 View 上显示的数据,这就是我希望根据 View 而有所不同的返回语句。

问题

Model View Controller 最佳实践指出,我们应该能够保持模型不变,并使用微小的调整来更改 View 。因此,如果不为 3 个 View 定义 3 个模型,我将如何调整我的数据函数以根据设置的 View 返回不同的语句?或者,用一句话概括一下,如何根据设置的 View 调整模型?

最佳答案

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

您必须仔细考虑 Qt::ItemDataRole::EditRoleQt::ItemDataRole::DisplayRole 这两个角色,以使其无缝运行。

main.cpp

#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();
}

ReverseModel.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);
}
}
};

关于c++ - 如何根据设置的 View 调整模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57915986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com