Qt có hỗ trợ khe thuần ảo không?


97

Dự án GUI của tôi trong Qtcó rất nhiều lớp "trang cấu hình" mà tất cả đều kế thừa trực tiếp từ đó QWidget.

Gần đây, tôi nhận ra rằng tất cả các lớp này đều chia sẻ 2 khe commons ( loadSettings()saveSettings()).

Về điều này, tôi có hai câu hỏi:

  • Có hợp lý không khi viết một lớp trừu tượng cơ sở trung gian (hãy đặt tên cho nó BaseConfigurationPage) với hai vị trí này dưới dạng các phương thức thuần ảo? (Mọi trang cấu hình có thể sẽ luôn có hai phương thức này, vì vậy tôi sẽ nói "có")
  • Trước khi tôi thực hiện thay đổi lớn trong mã của mình (nếu tôi phải làm): Qt có hỗ trợ khe thuần ảo không? Có điều gì tôi nên biết không?

Đây là một ví dụ mã mô tả mọi thứ:

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

Câu trả lời:


163

Có, giống như các phương thức ảo thuần túy c ++ thông thường. Mã do MOC tạo ra gọi là các khe ảo thuần túy, nhưng điều đó không sao vì dù sao thì lớp cơ sở cũng không thể được khởi tạo ...

Một lần nữa, cũng giống như các phương thức ảo thuần túy c ++ thông thường, lớp không thể được khởi tạo cho đến khi các phương thức được thực thi.

Một điều: trong lớp con, bạn thực tế không cần phải đánh dấu các phương thức ghi đè là các vị trí. Đầu tiên, chúng đã được triển khai dưới dạng các vị trí trong lớp cơ sở. Thứ hai, bạn chỉ đang tạo thêm công việc cho MOC và trình biên dịch vì bạn đang thêm một đoạn mã (nhỏ) nữa. Tầm thường, nhưng bất cứ điều gì.

Vì vậy, đi cho nó ..


1
Cảm ơn câu trả lời chính xác của bạn! Tôi sẽ kiểm tra điều này sớm nhất có thể;)
vào

3
Việc xóa đặc tả vị trí khỏi lớp con ngăn không cho moc gọi lớp con VÀ lớp cơ sở! - Cảm ơn anh bạn!
fmuecke

Trong Qt 5, ít nhất, nếu bạn đang sử dụng obj-ptr, member-func-ptr, obj-ptr, member-func-ptrphiên bản của connect, không có vị trí nào của bạn cần được khai báo như vậy.
Kyle Strand

phải thêm một số hành vi thực sự kỳ lạ: khi bạn đánh dấu các phương thức được ghi đè là các vị trí trong tiêu đề của lớp con, các vị trí luôn được gọi ngay cả khi có 0 kết nối với chúng. Đi hình !!!
bardao

2

Chỉ các vị trí trong Trang 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();
};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.