gpt4 book ai didi

c++ - 每个代理的非平凡 qt 模型数据操作

转载 作者:行者123 更新时间:2023-11-28 02:20:18 26 4
gpt4 key购买 nike

当我开始问here ,我试图在不同的 View 中以不同的方式查看 Qt 中单个模型中包含的数据,而无需创建更多模型并且无需更改它。

更具体地说:我正在尝试获取一个 QString 并在几个表中逐个字母地显示它,并进行在其他情况下被认为很简单的操作。

举一个这样的操作:一个表将反转字符串(该表只有一行,但由于与程序相关的原因,行编辑在这里不起作用)并去除任何空格( 保留在模型中,因为它们在其他 View 中是必需的)。

编辑: 给出一个更完整和具体的示例:Hello World -> Dlrow Olleh。我想反转大写并检查完全由大写字母组成的单词 - 那些将完全保持大写。

另一个计划中的操作也是删除所有空格,但这次表格将是一个矩阵(所以我猜需要对索引函数进行一些更改)。

EDIT2:请注意,矩阵的大小会根据输入的大小而改变以适合屏幕,因此索引(至少在表格本身中)不会保持不变。如果这很重要...

在过去的两天里,我一直在努力弄清楚如何做到这一点,我能找到的最好的方法(除了阅读 Qt 文档外,没有任何帮助)是 this article .

但是,它并没有解释每段代码在哪些方面做得足够好,因此不允许像我这样还不理解这个概念的人对代码进行任何更改以满足我的需要。

当然,我可以创建更多模型并在凌乱的底面之外执行所有这些操作,但我喜欢挑战自己并尽可能多地学习一些东西,并找到更好、更有效的做事方式。

当子类化时,我需要在 QAbstractProxyModel 中实现什么,更重要的是 - 我该怎么做(解释代码将不胜感激)为了创建一个代码来提供这种行为? (我知道每个代理可能会有所不同)

最佳答案

在您针对所需的各种行为使用必要的测试用例修改问题之前,这里有一个简单的代理,可以反转字符串值并去除所有空格:

class FlexibleProxy : public QIdentityProxyModel {
public:
enum {
StripSpaces = 0x1,
Reverse = 0x2
} Operation;
Q_DECLARE_FLAGS(Operations, Operation)
private:
Operations m_ops;
public:
FlexibleProxy(Operations ops, QObject * parent = 0) :
QIdentityProxyModel(parent), m_ops(ops) {}
QVariant data(QModelIndex & index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE {
auto val = QIdentityProxyModel::data(index, role);
if ((role == Qt::DisplayRole || role == Qt::EditRole)
&& val.userType() == QMetaType::QString) {
auto str = val.toString();
if (m_ops & StripSpaces) str.remove(QLatin1Char(' '));
if (m_ops & Reverse) reverse(str);
val.setValue(str);
}
return val;
}
};
Q_DECLARE_OPERATORS_FOR_FLAGS(FlexibleProxy::Operations)

static void reverse(QString & str) {
auto const size = str.size();
for (int i = 0; i <= size/2; ++i) {
std::swap(str[i], str[size-i]);
}
}

使用:

FlexibleProxy proxy{FlexibleProxy::Reverse | FlexibleProxy::StripSpaces};
proxy.setSourceModel(...);
view.setModel(&proxy);

关于c++ - 每个代理的非平凡 qt 模型数据操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32784270/

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