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

답변:


164

예, 일반 C ++ 순수 가상 방법과 같습니다. MOC에 의해 생성 된 코드는 순수 가상 슬롯을 호출하지만 기본 클래스는 어쨌든 인스턴스화 할 수 없기 때문에 괜찮습니다.

다시 말하지만 일반 C ++ 순수 가상 메서드와 마찬가지로 메서드에 구현이 제공 될 때까지 클래스를 인스턴스화 할 수 없습니다.

한 가지 : 서브 클래스에서 오버라이드 된 메서드를 슬롯으로 표시 할 필요가 없습니다. 첫째, 이미 기본 클래스의 슬롯으로 구현되어 있습니다. 둘째, (작은) 조금 더 많은 코드를 추가하기 때문에 MOC 및 컴파일러에 대한 더 많은 작업을 생성하고 있습니다. 사소하지만 무엇이든.

그러니 가서 ..


1
정확한 답변에 감사드립니다! 나는 이것을 가능한 한 빨리 테스트 할 것이다;)
ereOn

3
하위 클래스에서 슬롯 사양을 제거하면 moc가 하위 클래스 및 기본 클래스를 호출하지 못합니다! -고마워요!
fmuecke

당신이 사용하는 경우 Qt는 5 년, 적어도 obj-ptr, member-func-ptr, obj-ptr, member-func-ptr버전을 connect, 아무도 당신의 슬롯은 할 필요가 없습니다 선언 등.
Kyle Strand

정말 이상한 동작을 추가해야합니다. 재정의 된 메서드를 하위 클래스의 헤더에 슬롯으로 표시하면 슬롯이 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();
};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.