Apakah Qt mendukung slot murni virtual?


97

Proyek GUI saya di Qtmemiliki banyak kelas "halaman konfigurasi" yang semuanya diturunkan langsung dari QWidget.

Baru-baru ini, saya menyadari bahwa semua kelas ini berbagi 2 slot commons ( loadSettings()dan saveSettings()).

Mengenai ini, saya punya dua pertanyaan:

  • Apakah masuk akal untuk menulis kelas abstrak dasar menengah (sebut saja BaseConfigurationPage) dengan dua slot ini sebagai metode murni virtual? (Setiap halaman konfigurasi yang memungkinkan akan selalu memiliki dua metode ini, jadi saya akan mengatakan "ya")
  • Sebelum saya melakukan perubahan besar dalam kode saya (jika saya harus): apakah Qt mendukung slot murni virtual? Apakah ada yang harus saya waspadai?

Berikut adalah contoh kode yang menjelaskan semuanya:

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

Jawaban:


164

Ya, seperti metode virtual murni c ++ biasa. Kode yang dihasilkan oleh MOC memang memanggil slot virtual murni, tetapi tidak apa-apa karena kelas dasar tidak dapat dibuat instance-nya ...

Sekali lagi, seperti metode virtual murni c ++ biasa, kelas tidak dapat dibuat instance-nya sampai metode tersebut diberikan implementasi.

Satu hal: di subclass, Anda sebenarnya tidak perlu menandai metode yang diganti sebagai slot. Pertama, mereka sudah diimplementasikan sebagai slot di kelas dasar. Kedua, Anda hanya membuat lebih banyak pekerjaan untuk MOC dan kompiler karena Anda menambahkan kode (kecil) lebih banyak. Sepele, tapi terserah.

Jadi, lakukanlah ..


1
Terima kasih atas jawaban tepat Anda! Saya akan mengujinya sesegera mungkin;)
sebelum

3
Menghapus spesifikasi slot dari subclass mencegah moc memanggil subclass AND base class! - Terima kasih sobat!
fmuecke

Di Qt 5, setidaknya, jika Anda menggunakan obj-ptr, member-func-ptr, obj-ptr, member-func-ptrversi connect, tidak ada slot Anda yang perlu dideklarasikan seperti itu.
Kyle Strand

harus menambahkan beberapa perilaku yang sangat aneh: ketika Anda menandai metode yang diganti sebagai slot di header subkelas, slot dipanggil sepanjang waktu bahkan dengan 0 koneksi ke sana. Pergi gambar !!!
bardao

2

Hanya slot di 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();
};
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.