Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为多平台设计UI框架_C++_Qt_Design Patterns_Inheritance - Fatal编程技术网

C++ 为多平台设计UI框架

C++ 为多平台设计UI框架,c++,qt,design-patterns,inheritance,C++,Qt,Design Patterns,Inheritance,我们正在开发一个基于Qt的嵌入式软件UI框架,该框架目前可为两种设备供电——一部手机和一部平板电脑。以后可能会有其他具有完全不同UI的形状因素。目前,手机和平板电脑的用户界面都很相似,差异主要体现在尺寸上。我们希望向应用程序开发人员公开一个通用API(内部应用程序,无需外部应用程序),这样他们就不必为每个平台编写单独的屏幕 要开发屏幕,应用程序开发人员必须从屏幕类继承,或从更专业的屏幕(如PrefScreen类)继承。我们希望为每个组件向应用程序开发人员公开一个统一的接口,但在框架中使用特定于平

我们正在开发一个基于Qt的嵌入式软件UI框架,该框架目前可为两种设备供电——一部手机和一部平板电脑。以后可能会有其他具有完全不同UI的形状因素。目前,手机和平板电脑的用户界面都很相似,差异主要体现在尺寸上。我们希望向应用程序开发人员公开一个通用API(内部应用程序,无需外部应用程序),这样他们就不必为每个平台编写单独的屏幕

要开发屏幕,应用程序开发人员必须从屏幕类继承,或从更专业的屏幕(如PrefScreen类)继承。我们希望为每个组件向应用程序开发人员公开一个统一的接口,但在框架中使用特定于平台的实现。我们有以下课程:

ScreenBase(公开所有平台的通用接口) ScreenPhone:ScreenBase ScreenTablet:ScreenBase

PrefScreenBase(公开所有平台通用的接口)
PrefScreenPhone:PrefScreenBase PrefScreenTablet:PrefScreenBase

为了实现这一目标,我们有以下类型的DEF:

#ifdef PHONE
typedef ScreenPhone Screen;
typedef PrefScreenPhone PrefScreen;
#elif TABLET
typedef ScreenTablet Screen;
typedef PrefScreenTablet PrefScreen;
#endif
继承结构如下所示 屏幕库
|_屏幕电话
|_屏幕平板电脑

PrefScreenBase:Screen(根据构建平台解析为ScreenPhone或ScreenTablet)
|_预屏幕电话
|_PrefScreen平板电脑

Screen将在手机的构建中解析为ScreenPhone,并在平板电脑的构建中解析为ScreenTablet。 PrefScreen将解析为在手机的内部版本上PrefScreenPhone,并解析为在平板电脑的内部版本上PrefScreenTablet

在手机上,层次结构将是ScreenBase->ScreenPhone->PrefScreenBase->PrefScreenPhone 在平板电脑上,层次结构将是ScreenBase->ScreenTablet->PrefScreenBase->PrefScreenTablet

本质上,特定于平台的类派生自公共*基类,而*基类派生自基于其构建平台的适当类。 我们考虑使用桥接模式(http://en.wikipedia.org/wiki/Bridge_pattern)但我们的截止日期似乎不允许这样。此外,由于我们的框架是基于Qt框架的,因此将实现与接口分离将非常复杂

上述方法是否在任何框架中使用?您认为上述方法存在重大问题吗?如果是的话,还有什么选择?
我们的主要目标是将平台差异抽象给应用程序开发人员,并确保最大程度的代码重用。

我想您可以使用QDesktopWidget:

正如诺基亚文档所说:

QDesktopWidget类提供对多磁头系统屏幕信息的访问

具有多个图形卡和显示器的系统可以管理物理屏幕空间,既可以作为多个桌面,也可以作为大型虚拟桌面

此类提供有关用户桌面的信息,例如其总大小、屏幕数>、每个屏幕的几何图形,以及它们是配置为单独的>桌面还是单个虚拟桌面

Qt提供的小部件使用此类将工具提示、菜单和对话框放置在>正确的屏幕上,以显示它们的父部件或应用程序小部件。应用程序可以使用该类>获取可用于保存窗口位置的信息,或将子窗口小部件>和对话框放置在一个特定屏幕上


特别是:QDesktopWidget::screenGeometry(),您可以获得像素级的屏幕分辨率。

我建议您对此进行规划……您是否向Digia或QtProject寻求帮助?无论从哪个方向都有很多专家建议。@TonyWittry这纯粹是一个设计决策。我不确定Digia是否能比其他人更好地提供帮助。@hyde如果PrefScreen需要进一步扩展,会发生什么?这个屏幕层次结构只是许多小部件层次结构中的一个。屏幕结构只是一个例子。还有很多小部件需要使用类似的设计。获取屏幕尺寸不是问题。