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 ++ ทั่วไปคลาสจะไม่สามารถสร้างอินสแตนซ์ได้จนกว่าเมธอดจะได้รับการนำไปใช้งาน

สิ่งหนึ่ง: ในคลาสย่อยคุณไม่จำเป็นต้องทำเครื่องหมายเมธอด overriden เป็นสล็อต ขั้นแรกพวกเขาใช้เป็นสล็อตในคลาสพื้นฐานแล้ว ประการที่สองคุณกำลังสร้างงานเพิ่มเติมสำหรับ MOC และคอมไพเลอร์เนื่องจากคุณกำลังเพิ่มโค้ด (เล็ก ๆ ) อีกเล็กน้อย เล็กน้อย แต่อะไรก็ตาม

ไปเลย ..


1
ขอบคุณสำหรับคำตอบที่แม่นยำ! ฉันจะทดสอบให้เร็วที่สุด;)
เมื่อ

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.