1

我在一个项目中工作,我遇到了一个我不知道如何解决的设计问题。我想找到代码可扩展性的最佳解决方案。该项目包含一个带有标签的网络浏览器,但在标签中不仅有网页,我还可以有其他类型的小部件。我正在使用 Qt,因此选项卡中的小部件是 QWidgets(QWebview 和我仍然需要自己编写代码的其他类型)。无论如何,我会尽量保持这个问题足够通用。

有一个类 QWidget,其中 2 个类继承自:QWebView 和 MyWidget。我有一个可以包含它们的容器(QTabWidget),因为它可以包含 QWidget。此外,我有一个按钮(例如上一页按钮),它只适用于一种 QWidget:QWebView。所以,当我按下这个按钮时,我向 QTabWidget 询问当前的 QWidget,如果它是 QWebView,我会做一些事情,否则我什么都不做。这就是问题所在:我需要能够区分两种不同的类型:如果我让 QTabWidget 给我 currentWidget,它会给我一个 QWidget*,但我不知道它是 QWwbView 还是 MyWidget 和所以我必须做讨厌的 dynamic_cast<> 来检查真实的类型。这意味着如果我用另一个动作添加一个新的 MyWidget2,

我一直在考虑命令模式和策略模式,但我认为它们不太适用。

你有什么建议吗?谢谢

4

1 回答 1

1

在抽象级别上,听起来您需要某种方式将各种小部件类型映射到它们可以支持的操作(例如“转到上一页”) - 这样,当您添加新的小部件类型时,您可以指定它的操作也是。根据当前查看的选项卡,您可以启用/禁用相关操作,以便当用户能够执行某个操作时,您知道它将适用于当前正在查看的选项卡类型。

一种方法是将虚拟成员函数添加到返回相关操作的基本小部件类型。然后QWidget,您将选项卡小部件返回的 s 转换为您的基本小部件类型。这仍然涉及强制转换(因为QTabWidget没有准备好返回基本小部件类型的小部件),但是当您添加新类型的小部件时,它消除了可维护性问题。

于 2013-10-30T18:17:52.340 回答