2013-11-22 74 views
1

這個類沒有問題:Q_OBJECT產生許多錯誤

#include <QThread> 

class LiveImageItem : public QThread 
{ 
    Q_OBJECT 
public: 
    LiveImageItem(QPixmap pimg); 

signals: 

public slots: 

}; 

但這類得到與「Q_OBJECT」宏頭文件中定義相關的問題

#include <QGraphicsPixmapItem> 

class LiveImageItem : public QGraphicsPixmapItem 
{ 

    Q_OBJECT //this line will generate many errors in compiling 

public: 
    LiveImageItem(QPixmap pimg); 

signals: 

public slots: 

}; 

兩個他們的CPP文件是相同:

#include "LiveImageItem.h" 

LiveImageItem::LiveImageItem(QPixmap pimg) 
{ 
} 

I t要求每個QT對象基本上都是從QObject繼承的,所以如果我繼承了QObject的任何一個子類,我可以擁有所有QObject提供的魔法。上面的第二個版本(從QGraphicsPixmapItem繼承而來)似乎證明我錯了。事實證明,編譯時有很多錯誤,全部來自moc文件(由QT自動生成)。怎麼了?

一些錯誤是:

  • [qobject.h]錯誤: 'QScopedPointer的QObject ::應將d_ptr' 是 保護
  • [moc_LiveImageItem.cpp]錯誤:在這一範圍內

  • ...

+0

我看到你從QThread繼承LiveImageItem ...你應該閱讀這個:http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/ – TheDarkKnight

回答

4

根據文檔QGraphicsPixmapItem我不是QObject,所以你不能把它當作是對的。我會盡量延長你的類繼承,並做到:

class LiveImageItem : public QObject, public QGraphicsPixmapItem 
{ 

    Q_OBJECT //this line will generate many errors in compiling 
[..] 
+1

QObject或QGraphicsObject – Wagmare

1

正如@vahancho說,QGraphicsPixmapItem不是一個QObject。事實上,這可以說是大多數QGraphics * Item類。

但是,如果你想使用信號和槽與QGraphicsSystem類,你可以從QGraphicsObject繼承: -

class LiveImageItem : public QGraphicsObject 
{ 
    Q_OBJECT 

    public: 


    private: 
     QPixmap m_pixmap; 
}; 

這樣,你會覆蓋塗料的功能在這個類,並從那裏繪製像素圖。