2010-04-07 19 views
7

Tôi có một lớp học như thế này
Tôi có thể kế thừa từ cả QWidget và QThread như thế nào?

class GUI : public QWidget, public QThread 

Khi tôi làm các việc trên tôi nhận lỗi về tín hiệu kết nối. The error says Reference to "connect" is ambiguous. Có cách nào để kế thừa từ cả hai?

Cảm ơn bạn

+5

Vui lòng giải thích lý do bạn muốn thực hiện việc này. Vì nó không thể được thực hiện (xem câu trả lời), chúng tôi muốn biết những điều mà * sẽ * làm việc để đề xuất cho bạn. Điều đó đòi hỏi nhiều thông tin hơn. –

+0

chương trình của tôi nhận tin nhắn từ một máy tính khác qua firewire. Tin nhắn nhận được được chuyển hướng đến một tập tin từ đó GUI đọc chúng. Tôi muốn xử lý các tin nhắn firewire trong một luồng và GUI trong một luồng khác. – infinitloop

Trả lời

11

Bạn không thể. Cả hai số QWidgetQThread được kế thừa (không phải hầu như) từ QObject. Do đó, bạn không có dẫn xuất ảo, do đó hai bản sao của QObject, làm lẫn lộn trình biên dịch. QObject được thiết kế đặc biệt theo cách này. Xem:

Có một số người bị cáo buộc đã đi xung quanh này (không thể tìm thấy liên kết ngay bây giờ, nhưng nó ra có trên Google, tôi đã có những rắc rối tương tự hai vài tuần trước), nhưng nó không an toàn nhất.

Chỉnh sửa: cách tốt nhất có thể là để có một đối tượng khác kế thừa từ QThread và giữ đối tượng đó làm thành viên trong lớp GUI của bạn. Đó là cách giải quyết hầu hết mọi người làm trong vấn đề này.

-1

Bạn không thể kế thừa từ nhiều QObject.

Bạn có thể kế thừa từ một và biến thành viên khác thành biến và làm việc từ đó.

class GUI : public QWidget 
{ 
    QThread myThread; 
}; 

Bạn đã đặt tên GUI cho lớp học - đây có phải là GUI chính của chương trình của bạn không? Xem các ví dụ trong thư mục ví dụ về Qt - chúng có các chương trình mẫu trên cả hai số GUI'sThreads.

+2

Chỉ chủ đề chính mới có thể hoạt động trên các tiện ích, do đó, làm cho tiện ích trở thành thành viên của một chuỗi có vẻ lạ. Điều này có thể đạt được điều gì? –

+0

oops, không biết điều đó. – Will

+3

"bạn nên kế thừa từ QMainWindow" là sai, bạn chỉ nên làm điều đó nếu bạn thực sự muốn một số tính năng được cung cấp bởi QMainWindow. Bất kỳ QWidget nào không có cha/mẹ đều tự động là một cửa sổ. – rohanpm

0

QWidgets và các đối tượng liên quan đến GUI không nằm trong các chủ đề khác nhau so với chuỗi chính của ứng dụng. Bạn không nên kế thừa cả hai. Bạn cũng không thể gọi hàm moveToThread() của tiện ích con.

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