如何将复杂的分层模型拆分为两个部分视图?
How to split a complex hierarchical Model into two partial Views?
我正在学习 Qt 的 Model/View 范式,因为它似乎非常适合编辑我必须处理的数据结构,例如这个:
Addition
|_QuadraticFunction
| |_intercept=0.2
| |_slope=0.0
| |_quadratic=1.2
|_Multiplication
|_LinearFunction
| |_intercept=0.0
| |_slope=-8.9
|_Gaussian
|_center=0.6
|_sigma=0.4
我的数据结构由函数组合而成,每个函数都有自己的属性。但是,我不想在单个 TreeView 中显示整个数据结构,因为它对于复杂的结构来说可能会变得太长。相反,我想显示一个仅包含函数名称的视图,而另一个视图仅显示用户通过单击鼠标在前一个视图中选择的函数的属性,如下所示:
(FunctionsView,第一个View)
Addition
|_QuadraticFunction
|_Multiplication
|_**LinearFunction**
|_Gaussian
(selectedFunctionView,第二个View)
intercept 0.0
slope -8.9
在此示例中,用户在第一个视图中单击 LinearFunction,第二个视图自动显示其属性。
我的问题是:我可以将所有数据结构(函数名称和函数属性)保存在一个模型下,然后有两个视图只显示模型的一部分吗?如果不是,我是否必须为每个部分视图创建一个模型,每个模型索引数据结构的不同部分?请帮忙,我对此没有经验。
.何塞
是的,您绝对可以将所有内容都放在一个模型中,并使用两种不同的视图。您可能想要查看 QSortFilterProxyModel;每个视图都会有其中一个。代理应用排序和过滤——过滤就是你在这里做的——到一个更完整的模型。当你在主视图中 select 某些东西时,你会想要发出一个信号,该信号被另一个代理模型(或另一个视图传递给它的代理)接收,然后根据新的 selected 项。整体上其实非常好用。最容易犯的错误是对使用哪个模型索引感到困惑,因为您将拥有代理的模型索引和完整模型的模型索引,有时您必须在两者之间进行转换。该文档非常清楚地说明了必要的地方,但它有助于额外了解它。
看看文档,如果有更多问题,请提问。
我正在学习 Qt 的 Model/View 范式,因为它似乎非常适合编辑我必须处理的数据结构,例如这个:
Addition
|_QuadraticFunction
| |_intercept=0.2
| |_slope=0.0
| |_quadratic=1.2
|_Multiplication
|_LinearFunction
| |_intercept=0.0
| |_slope=-8.9
|_Gaussian
|_center=0.6
|_sigma=0.4
我的数据结构由函数组合而成,每个函数都有自己的属性。但是,我不想在单个 TreeView 中显示整个数据结构,因为它对于复杂的结构来说可能会变得太长。相反,我想显示一个仅包含函数名称的视图,而另一个视图仅显示用户通过单击鼠标在前一个视图中选择的函数的属性,如下所示:
(FunctionsView,第一个View)
Addition
|_QuadraticFunction
|_Multiplication
|_**LinearFunction**
|_Gaussian
(selectedFunctionView,第二个View)
intercept 0.0
slope -8.9
在此示例中,用户在第一个视图中单击 LinearFunction,第二个视图自动显示其属性。
我的问题是:我可以将所有数据结构(函数名称和函数属性)保存在一个模型下,然后有两个视图只显示模型的一部分吗?如果不是,我是否必须为每个部分视图创建一个模型,每个模型索引数据结构的不同部分?请帮忙,我对此没有经验。
.何塞
是的,您绝对可以将所有内容都放在一个模型中,并使用两种不同的视图。您可能想要查看 QSortFilterProxyModel;每个视图都会有其中一个。代理应用排序和过滤——过滤就是你在这里做的——到一个更完整的模型。当你在主视图中 select 某些东西时,你会想要发出一个信号,该信号被另一个代理模型(或另一个视图传递给它的代理)接收,然后根据新的 selected 项。整体上其实非常好用。最容易犯的错误是对使用哪个模型索引感到困惑,因为您将拥有代理的模型索引和完整模型的模型索引,有时您必须在两者之间进行转换。该文档非常清楚地说明了必要的地方,但它有助于额外了解它。
看看文档,如果有更多问题,请提问。