Qt是否支持虚拟纯插槽?

我在Qt中的GUI项目有很多“configuration页面”类,它们都直接从QWidgetinheritance

最近,我意识到所有这些类共享2个公共时隙( loadSettings()saveSettings() )。

对此,我有两个问题:

  • 用这两个插槽编写一个中间基本抽象类(让它命名为BaseConfigurationPage )是否是有意义的虚拟纯方法? (每个可能的configuration页面将总是有这两个方法,所以我会说“是”)
  • 在我做我的代码的重大变化之前(如果我必须):Qt是否支持虚拟纯插槽? 有什么我应该知道的?

这是一个描述一切的代码示例:

 class BaseConfigurationPage : public QWidget { // Some constructor and other methods, irrelevant here. public slots: virtual void loadSettings() = 0; virtual void saveSettings() = 0; }; class GeneralConfigurationPage : public BaseConfigurationPage { // Some constructor and other methods, irrelevant here. public slots: void loadSettings(); void saveSettings(); }; 

2 Solutions collect form web for “Qt是否支持虚拟纯插槽?”

是的,就像常规的c ++纯虚拟方法一样。 由MOC生成的代码确实会调用纯虚拟插槽,但没关系,因为基类无法实例化。

同样,就像常规的c ++纯虚拟方法一样,只有在方法被赋予实现之后,类才能被实例化。

有一件事:在子类中,实际上并不需要将重写方法标记为插槽。 一,它们已经作为基类中的插槽来实现。 二,你只是为MOC和编译器创build更多的工作,因为你正在添加一个(微小的)多一点的代码。 琐碎,但无论如何。

所以,去吧..

只有BaseConfigurationPage中的插槽

 class BaseConfigurationPage : public QWidget { // Some constructor and other methods, irrelevant here. public slots: virtual void loadSettings() = 0; virtual void saveSettings() = 0; }; class GeneralConfigurationPage : public BaseConfigurationPage { // Some constructor and other methods, irrelevant here. void loadSettings(); void saveSettings(); }; 
  • 如何在Qt Creator中启用C ++ 11?
  • 如何使用QMake的subdirs模板?
  • 如何使用Qt创build暂停/等待function?
  • Qt:找不到-lGL错误
  • 如何将int转换为QString?
  • 为Visual Studio 2012编译Qt 4.8.x
  • 全屏部件
  • 如何在Qt,GCD风格的给定线程中执行函数或lambda?
  • 在没有预处理步骤的情况下,Qt可用性如何?
  • 添加一个定义给qmake一个值?
  • 如何在基于Qt的项目中设置应用程序图标?