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中发出跨线程信号?
  • 解释段错误消息
  • Visual Studio 2012 Natvis跳过IndexListItems
  • 如何在Qt Creator中启用C ++ 11?
  • 我可以在没有qmake或Qt Creator的情况下使用Qt吗?
  • Qt - 键盘和鼠标事件透明度的顶级小部件?
  • 在Qt中测量文字宽度
  • Qt - “暗影大厦”?
  • 非Qt基类
  • QPainterPaths的高效屏幕外渲染(需要OpenGL和非OpenGL解决scheme)
  • 防止Qt中的解雇信号