2012-11-05 94 views
3

我要畫一個圖像和幾行,用我的子類QGraphicsItem如何使用QGraphicsItem繪製圖像?

這裏是我的代碼(頭文件) -

#ifndef LED_H 
#define LED_H 

#include <QtGui> 
#include <QGraphicsItem> 

class LED : public QGraphicsItem 
{ 
public: 
    explicit LED(); 

    QRectF boundingRect() const; 

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, 
       QWidget *widget); 

private: 
    static QPixmap *led_on; //<--Problem 
}; 

#endif // LED_H 

注意 - LED將被添加到QGraphicsScene

現在我不知道如何處理它(使用QGraphicsItem繪製圖像),但決定使用static QPixmap,它應該由LED類的所有實例共享。

而且在CPP文件中加入這個 - >

QPixmap* LED::led_on = new QPixmap(":/path"); 

但我得到的構建這個錯誤,運行 -

QPixmap: Cannot create a QPixmap when no GUI is being used 
QPixmap: Must construct a QApplication before a QPaintDevice 
The program has unexpectedly finished. 

請告訴我該怎麼做。 (我是Qt新手) 我應該使用QImage還是其他的東西?

+0

邊注:由於的QGraphicsItem沒有從QObject的繼承,則不能使用的信號或插槽。所以你應該刪除「信號:」和「公共插槽:」宏。 – Anthony

+0

@Anthony:哦對! QtCreator自動添加它,我將刪除它。 –

回答

3

由於錯誤提示,您必須在QApplication創建後創建QPixmap。顯然你所做的事會導致相反的情況發生。對於這個問題的多種解決方案,但這個是很乾淨:創建初始化的QPixmap的LED類的靜態成員:

void LED::initializePixmap() // static 
{ 
    led_on = new QPixmap(":/path"); 
} 

現在設計你的主要功能如下:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); // first construct the QApplication 

    LED::initializePixmap(); // now it is safe to initialize the QPixmap 

    MainWindow w; // or whatever you're using... 
    w.show(); 

    return a.exec(); 
} 
+0

爲了本地化LED源代碼中的init代碼,我們可以使用lazy init,就像只在指針爲零時(第一次使用時)調用new一樣。 –

0

這是一個問題,導致QT間期的GUI類需要一個正在運行的QApplication喜歡...

main(int argc, char* argv[]) 
{ 
    QApplication a(argc, argv); 

    // your gui class here 

    return a.exec(); 
} 

,所以你需要建立一個QT-GUI類和例如的QGraphicsView顯示它

現在,當你有一個graphicsview顯示你需要一個場景來顯示和的QGraphicsItem添加到場景內容...