Чи підтримує Qt віртуальні чисті слоти?


97

Мій проект графічного інтерфейсу 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
Дякуємо за точну відповідь! Я протестую це якомога швидше;)
ere8

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();
};
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.