Tôi có một lớp (MyClass
) thừa kế hầu hết các chức năng của nó từ đối tượng tích hợp Qt (QGraphicsTextItem
). QGraphicsTextItem
kế thừa gián tiếp từ QObject
. MyClass
cũng triển khai giao diện, MyInterface
.Sử dụng tín hiệu Qt và các khe có nhiều thừa kế
class MyClass : public QGraphicsTextItem, public MyInterface
tôi cần để có thể sử dụng connect
và disconnect
trên MyInterface*
. Nhưng có vẻ như connect
và disconnect
chỉ hoạt động trên QObject*
trường hợp. Vì Qt không hỗ trợ đa thừa kế từ các lớp dẫn xuất QObject, tôi không thể lấy được MyInterface
từ QObject
. (Tuy nhiên, cũng không có ý nghĩa gì đối với giao diện.)
Có discussion of the problem online, nhưng IMO giải pháp được đề xuất là khá vô dụng trong trường hợp thông thường (truy cập một đối tượng thông qua giao diện của nó), vì bạn không thể kết nối các tín hiệu và các khe từ MyInterface*
nhưng phải đặt nó vào loại có nguồn gốc. Vì MyClass
là một trong số nhiều lớp học MyInterface
-derived, điều này sẽ đòi hỏi phải có "mã-smelly" nếu-này-cast-to-này-else-nếu-đó-cast-to-rằng phát biểu và đánh bại mục đích của giao diện.
Có giải pháp tốt cho giới hạn này không?
UPDATE: tôi nhận thấy rằng nếu tôi dynamic_cast
một MyInterface*
-QObject*
(vì tôi biết tất cả MyInterface
lớp -derived cũng kế thừa cuối cùng từ QObject
, có vẻ như để làm việc Đó là:.
MyInterface *my_interface_instance = GetInstance();
connect(dynamic_cast<QObject*>(my_interface_instance), SIGNAL(MyInterfaceSignal()), this, SLOT(TempSlot()));
Nhưng điều này thực sự có vẻ như tôi đang yêu cầu hành vi không xác định ....
Bạn đã khai báo MyInterfaceSignal ở đâu và ở đâu? –
'MyInterfaceSignal' được khai báo là phương thức ảo thuần túy được bảo vệ * không có tín hiệu * trong' MyInterface', và sau đó là tín hiệu * trong các lớp dẫn xuất. Do đó, trình biên dịch đảm bảo rằng các lớp dẫn xuất có phương thức, nhưng nó tùy thuộc vào người triển khai để đánh dấu nó như một tín hiệu. Đó là hokey, bởi vì tôi không * thực sự * gọi lên bảng gọi ảo từ 'MyInterface.MyInterfaceSignal', nhưng đúng hơn là dựa vào thực tế là macro SIGNAL là - vào cuối ngày - chỉ giải quyết cho một' char * 'tên phương thức. –