我不经常创建GUI,但今天我这样做,我希望有一些设计输入。
基本上我有一个后端,我打算使用MVC模式添加GUI。问题是我觉得无论什么类封装主GUI窗口都会有很多状态(所有的子元素);最重要的是,它会有很多制定者,也可能有吸气剂,清晰度,颜色,大小,位置和刷新功能。
一个选择是继续前进这个想法,并有一个非常大的公共接口,处理GUI使用的类型(std::string
,std::vector<std::string>
...)越多控制我希望通过UI获得我需要的更多公共成员功能。
另一种选择是将程序状态传递给GUI并让它决定如何显示它,我担心这样做会意味着它会给我不那么精细的细节控制并且会打破关注点的分离并且意味着对程序状态表示的任何更改都需要在GUI中进行更改。
对此事的任何意见都会有很大的帮助。
如果它有所不同,那么这是一个使用ncurses抽象的C ++ gui。
答案 0 :(得分:2)
听起来我对你有很多关于M和V的看法,但对C语的描述并不多。该模式应该真正称为MCV,因为整个想法是控制器是你模型之间的桥梁(数据) )和视图(GUI)。听起来你需要一个具有你提到的大部分功能的控制器。
简单地说,您的模型显然应该对显示一无所知,并且您的显示(视图)不应该知道如何访问模型。您需要一个读取数据(模型)的控制器并向显示器(视图)发出指令。如果您在视图中有用户交互,则控制器可以解释该视图并根据需要修改模型。
这个想法是你永远不必改变所有3,但是如果你改变模型或视图,你几乎总是需要更新控制器。
希望有帮助...
答案 1 :(得分:0)
巨型界面至少有一种替代方案。而不是具有处理每个事物的功能(大小,字体,颜色,显示内容等)具有接受“角色”的单一功能和表示角色的数据。这需要某种包含多种数据类型的包装器。
QT's QAbstractItemModel Class Reference有一个很好的例子:
QVariant QAbstractItemModel :: data(const QModelIndex&amp; index,int role = Qt :: DisplayRole)const [pure virtual]
该函数将执行的操作是返回表示所提供索引处指示的角色的QVariant。
这种方法的缺点是,您必须知道存在哪些角色以及它们的作用。 QT's default roles are shown here.
答案 2 :(得分:0)
我喜欢让模型的某些部分能够自我测量:
class Model {
private:
int value;
public:
void instrument(Instrumenter& instrumenter);
};
Instrumenter
管理控件的创建。该模型将告诉它如何控制它并让它访问数据。
void Model::instrument(Instrumenter& instrumenter) {
instrumenter.addRangeController(0, 100, 5, value);
}
然后,对于不同的输入设备(例如键盘,触摸屏),您可以创建适当的控件:
class KeyboardInstrumenter : public Instrumenter {
public:
void addRangeController(int min, int max, int increments, int& controlled) {
// create 3 widgets, up arrow, down arrow, and value
}
};
class TouchscreenInstrumenter : public Instrumenter {
public:
void addRangeController(int min, int max, int increments, int& controlled) {
// create slider with min, max and increments
}
};
不是直接传递int
,而是将它包装在一个控制对象中,以帮助封装。