更改不同对象的选项

问题描述 投票:0回答:1

我有一个包含多个视图的程序。有些视图本身包含不同的对象,有些只是以类似表格的方式显示数据。

所有这些视图以及某些显示的对象都有不同的选项。

我现在拥有的是以下内容:

我有一个对话框类,它为每个对象/视图提供不同的选项卡以显示/更改选项。我有不同的处理程序类,用作将选项传递到属性对话框的指针。

我想做的是将视图/对象传递到处理程序类中以更改选项。

我考虑过使用模板,但后来意识到我不能真正做到这一点,因为每个视图/对象类都有不同的选项,因此应用它们将取决于对象本身。

使用

is_same
实际上会违背模板的目的。

更好的解决方案是什么?

一些代码:

std::unique_ptr<PropertiesHandler> propertiesPtr;
#if __cplusplus > 201300
    auto ptr = std::make_unique<Handler>( m_conf->m_dbOptions, m_canvas );
#else
    auto ptr = std::unique_ptr<Handler>( new Handler( m_conf->m_dbOptions, m_canvas ) );
#endif
    propertiesPtr = std::move( ptr );
    propertiesPtr->SetType( m_type == View ? ViewProperties : ObjectProperties );

这就是我将选项传递到属性对话框的方式。

编辑

在属性对话框中,我有以下代码:

auto type = handler->GetType() )
switch( type )
{
    case ViewProperties:
        Handler *propHandler = dynamic_cast<>( handler );
        // create pages relevant for the view 1
}
c++ c++11
1个回答
0
投票

反射是这个问题的标准解决方案。

对象具有属性。 这些属性可以在运行时由其他对象通过某种反射机制进行检查。

视图又都具有属性,并且可以修改它们所包含的对象的哪些属性被公开(以及如何公开)。

一旦获得视图的属性(以及对象的过滤器属性),您就可以使用数据驱动设计来填充属性对话框。

属性的结构以及您所公开的内容成为这里的关键。 例如,将两个属性“x”和“y”公开为数字是一回事,将这两个属性公开为名为“location”的子属性的同级属性是另一回事。 并且用元信息标记“位置”子属性,说明它是坐标,这更加详细。

在属性对话框中,当您看到标记为坐标的子属性时,您可以生成一对 x/y 旋转框,甚至可能是一个允许您选择位置的十字线控件。

您最终要么在属性级别添加元信息,要么教属性对话框为每种视图/对象使用自定义布局(通过一些数据)。 第一个是更多的代码,第二个是更多的用户体验工作。

这两种情况的核心是,您手写 C++ 来决定每个控件存在的确切位置以及文本是什么。 您确实希望像这样的 UX 是数据驱动的,无论是直接来自反射还是来自某种非 C++ 布局语言。 (我想 ASL 就可以了)

© www.soinside.com 2019 - 2024. All rights reserved.