代码之家  ›  专栏  ›  技术社区  ›  ereOn

Qt是否支持虚拟纯插槽?

  •  87
  • ereOn  · 技术社区  · 14 年前

    我的图形用户界面项目 Qt 有很多“配置页”类,它们都直接从 QWidget .

    最近,我意识到所有这些类都共享两个公共插槽( 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();
    };
    
    2 回复  |  直到 6 年前
        1
  •  146
  •   llllllllll    6 年前

    是的,就像普通C++纯虚方法一样。MOC生成的代码确实调用了纯虚拟槽,但这没关系,因为基本类无论如何都不能实例化…

    同样,就像常规C++纯虚方法一样,类不能实例化直到方法被赋予实现。

    一件事:在子类中,实际上不需要将重写方法标记为slot。首先,它们已经作为基类中的槽实现。其次,您只是在为MOC和编译器创建更多的工作,因为您添加了(微小的)更多的代码。微不足道,但无论如何。

    所以,去吧。

        2
  •  0
  •   lygstate    11 年前

    仅限基本配置页中的插槽

    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();
    };