2010-09-16 41 views
21

Tôi có một bộ khá phức tạp các lớp C++ được viết lại từ Java. Vì vậy, mỗi lớp có một lớp kế thừa duy nhất, và sau đó nó cũng thực hiện một hoặc nhiều lớp trừu tượng (hoặc giao diện).Giao diện Qt hoặc lớp trừu tượng và qobject_cast()

Có thể sử dụng qobject_cast() để chuyển đổi từ lớp học sang một trong các giao diện không? Nếu tôi lấy được tất cả các giao diện từ QObject, tôi gặp lỗi do tham chiếu QObject mơ hồ. Tuy nhiên, nếu tôi chỉ có lớp cơ sở được kế thừa từ QObject, tôi không thể sử dụng qobject_cast() do hoạt động với QObject s.

Tôi muốn có thể ném xung quanh các lớp giữa các plugin và DLL được tham chiếu bởi giao diện của chúng.

+0

Khi tôi đọc thêm tài liệu, tôi không chắc chắn những gì tôi muốn làm là có thể ... và điều đó không tốt. Tôi có thể sử dụng RTTI dựa .dynamicCast () nhưng nó không âm thanh như thế sẽ luôn luôn làm việc trên ranh giới DLL. –

+0

Tôi thấy điều này: http://stackoverflow.com/questions/3201273/qt-moh-multiple-inheritance-problem vì vậy tôi đoán nó đã được yêu cầu. –

Trả lời

28

Sau khi một số nghiên cứu và đọc the qobject_cast documentation, tôi thấy điều này:

qobject_cast() cũng có thể được sử dụng trong kết hợp với giao diện; xem Cắm & Ví dụ về sơn để biết chi tiết.

Đây là liên kết đến ví dụ: Plug & Paint.

Sau khi đào lên interfaces header trong ví dụ này, tôi đã tìm thấy macro Q_DECLARE_INTERFACE cho phép bạn thực hiện những gì bạn muốn.

Đầu tiên, không kế thừa QObject từ giao diện của bạn. Đối với mỗi giao diện mà bạn có, sử dụng tờ khai Q_DECLARE_INTERFACE như thế này:

class YourInterface 
{ 
public: 
    virtual void someAbstractMethod() = 0; 
}; 

Q_DECLARE_INTERFACE(YourInterface, "Timothy.YourInterface/1.0") 

Sau đó, trong định nghĩa lớp học của bạn, sử dụng Q_INTERFACES vĩ mô, như thế này:

class YourClass: public QObject, public YourInterface, public OtherInterface 
{ 
    Q_OBJECT 
    Q_INTERFACES(YourInterface OtherInterface) 

public: 
    YourClass(); 

    //... 
}; 

Sau khi tất cả các rắc rối này, các công trình đoạn mã sau :

+0

Ahh! Mát mẻ. Tôi đã thử Q_DECLARE_INTERFACE, nhưng không thêm Q_INTERFACES vào đối tượng dẫn xuất. Cảm ơn đã giúp đỡ. –

+0

@Timothy - Tôi rất vui vì tôi có thể giúp. Tôi học một cái gì đó mới về Qt mỗi ngày. :) – Venemo

+2

Thông thường, mọi người sử dụng 'if (YourInterface * i = qobject_cast (c)) {}'. Điều này đảm bảo rằng con trỏ không bao giờ được sử dụng nếu nó không hợp lệ. – Puppy

Các vấn đề liên quan