Qt, sanal saf yuvaları destekliyor mu?


97

İçindeki GUI projem, Qttümü doğrudan miras alınan birçok "yapılandırma sayfası" sınıfına sahip QWidget.

Son zamanlarda, tüm bu sınıfların 2 ortak yuvayı ( loadSettings()ve saveSettings()) paylaştığını fark ettim .

Bununla ilgili olarak iki sorum var:

  • BaseConfigurationPageSanal saf yöntemler olarak bu iki yuvayla bir ara temel soyut sınıf yazmak (adlandıralım ) mantıklı mı ? (Olası her yapılandırma sayfası her zaman bu iki yönteme sahip olacaktır , bu yüzden "evet" derdim)
  • Kodumdaki ağır değişikliği yapmadan önce (gerekirse): Qt sanal saf slotları destekliyor mu? Bilmem gereken bir şey var mı?

İşte her şeyi açıklayan bir kod örneği:

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

Yanıtlar:


164

Evet, tıpkı normal c ++ saf sanal yöntemler gibi. MOC tarafından üretilen kod saf sanal yuvaları çağırıyor, ancak bu sorun değil çünkü temel sınıf yine de başlatılamıyor ...

Yine, normal c ++ saf sanal yöntemler gibi, yöntemlere bir uygulama verilinceye kadar sınıf başlatılamaz.

Bir şey: alt sınıfta, aslında geçersiz kılma yöntemlerini yuvalar olarak işaretlemenize gerek yoktur. İlk olarak, bunlar zaten temel sınıfta yuvalar olarak uygulanmıştır. İkincisi, (küçük) biraz daha fazla kod eklediğiniz için MOC ve derleyici için daha fazla çalışma yaratıyorsunuz. Önemsiz, ama her neyse.

Öyleyse, devam et ..


1
Kesin cevabınız için teşekkürler! Bunu mümkün olan en kısa sürede test edeceğim;)
ereOn

3
Alt sınıftan yuva belirtiminin kaldırılması, moc'un alt sınıfı VE temel sınıfı çağırmasını engeller! - Teşekkürler dostum!
fmuecke

Eğer kullanıyorsanız Qt 5'te, en azından obj-ptr, member-func-ptr, obj-ptr, member-func-ptrsürümünü connect, hiçbiri senin yuvaların gerekmektedir ilan gibi.
Kyle Strand

bazı gerçekten garip davranışlar eklemek zorunda: geçersiz kılma yöntemlerini alt sınıfın başlığındaki yuvalar olarak işaretlediğinizde, yuvalar her zaman 0 bağlantı olsa bile çağrılır. Şekle git !!!
bardao

2

Yalnızca BaseConfigurationPage'deki yuvalar

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();
};
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.