2012-02-08 27 views
5

Tôi có một lớp BatchItem mà thừa hưởng QObject, cộng thêm một vài lớp kế thừa từ BatchItem:Tại sao tôi không thể đặt cha mẹ QObject trong một lớp mà QObject chỉ là một cơ sở gián tiếp?

#ifndef BATCHITEM_H 
#define BATCHITEM_H 

#include <QObject> 

class BatchItem : public QObject 
{ 
    Q_OBJECT 
public: 
    virtual void start() = 0; 
    virtual void stop() = 0; 

signals: 
    /* ... some signals ... */ 

}; 

#endif // BATCHITEM_H 

Ví dụ về một lớp kế thừa từ BatchItem:

#ifndef VIDEOBATCHITEM_H 
#define VIDEOBATCHITEM_H 

#include "batchprocessing/batchitem.h" 

#include <QtCore/QObject> 

class VideoBatchItem : public BatchItem 
{ 
    Q_OBJECT 
public: 
    explicit VideoBatchItem(/* ... */, QObject *parent = 0); 

    void start(); 
    void stop(); 

private: 
    /* ... some private member variables ... */ 
}; 

#endif // VIDEOBATCHITEM_H 

Và đây là .cpp tương ứng:

#include "videobatchitem.h" 

VideoBatchItem::VideoBatchItem(/* ... */, 
           QObject *parent) : 
    /* ... */, 
    QObject(parent) 
{ 
    /* ... */ 
} 

/* ... */ 

Nhưng khi tôi cố gắng biên dịch, tôi nhận được lỗi rống:

error: type ‘QObject’ is not a direct base of ‘VideoBatchItem’ 

Dĩ nhiên tôi thấy rằng điều này là đúng, như QObject chỉ là một căn cứ gián tiếp của VideoBatchItem. Nhưng tại sao lại là một vấn đề? Đó không phải là trường hợp cho ví dụ QAbstractScrollArea, được kế thừa từ QFrame, lần lượt kế thừa từ QWidget? Tất cả họ đều lấy QWidget làm cha mẹ của họ, mặc dù QAbstractScrollArea chỉ được thừa kế gián tiếp từ QWidget. Thật không may tôi không thể tìm thấy câu trả lời cho điều đó trong cả tài liệu cũng như các tệp .cpp của các lớp tiện ích được đặt tên.

Vì tôi không thể vượt qua một phụ huynh QObject, vẫn còn một cách để sử dụng hệ thống cha mẹ-con của Qt để hủy các mục hàng loạt có nguồn gốc của tôi không?

Trả lời

4

Bạn không thể gọi hàm tạo cơ sở QObject. Nó không quan trọng về loại tham số cha mẹ nhưng gọi của QObject (QObject * cha mẹ). Bạn nên gọi trong trường hợp này là BatchItem() không có tham số và gọi setParent (parent) trong phần thân của hàm tạo, hoặc quá tải hàm tạo BatchItem (QObject *).

+0

Tôi đã quá tải công cụ BatchItem, điều đó đã giúp ích. Cám ơn! – steps

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