Qt是否支持虚拟纯插槽?


97

我的GUI项目中Qt有很多“配置页”类,它们都直接从继承QWidget

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

对此,我有两个问题:

  • BaseConfigurationPage用这两个插槽作为虚拟纯方法编写中间基础抽象类(让其命名)是否有意义?(每个可能的配置页面都将始终具有这两种方法,因此我会说“是”)
  • 在进行代码的重大更改之前(如果需要):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();
};

Answers:


163

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

同样,就像常规的c ++纯虚拟方法一样,在为这些方法提供实现之前,无法实例化该类。

一件事:在子类中,您实际上不需要将重写的方法标记为插槽。首先,它们已经在基类中实现为插槽。其次,由于要添加(少量)更多的代码,因此您将为MOC和编译器创建更多工作。琐碎,但随便。

所以,去吧。


1
感谢您的准确答复!我将尽快对此进行测试;)
ereOn 2010年

3
从子类中删除插槽规范可防止moc调用子类和基类!- 谢啦!
fmuecke 2012年

在Qt 5,至少,如果你正在使用obj-ptr, member-func-ptr, obj-ptr, member-func-ptr的版本connect没有你的插槽需要被宣布为此类。
凯尔·斯特兰德

必须添加一些非常奇怪的行为:在子类的标头中将重写的方法标记为插槽时,即使它们之间有0个连接,插槽也始终被调用。去搞清楚!!!
bardao

2

只有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();
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.