2016-07-14 37 views
1

我正在嘗試開發一個使用qt的項目,但我已經面臨將項目添加到場景的兩個問題! 我有一個類包含我的背景對象,它得到一個指向我的場景在其構造函數中的指針。將項目添加到QGraphicsScene中的兩個錯誤

  1. 我試過 「scene->的addItem(本)」 爲背景添加到場景。然而,在運行該項目時,據報道該項目已被添加到場景中!這裏是我調用addItem的唯一地方。

  2. 我也試圖做幾個類的新對象,並把它們放在一個QList中。在添加它們時,這些項目根本不會出現在場景中!

這裏是類:

class Test : public QObject, public QGraphicsPixmapItem{ 
    Q_OBJECT 
public: 
    Test(QGraphicsScene *s){ 
     scene = s; 
     setPixmap(QPixmap("a.jpg")); 
     setPos(0, 0); 
     scene->addItem(this); 
    } 
    void mousePressEvent(QGraphicsSceneMouseEvent *event){ 
     list.push_back(new A(QPixmap("b.png"))); 
     scene->addItem(list.back()); 
    } 
private: 
    QGraphicsScene *scene; 
} 

附: A是繼承B的類,它本身繼承了公共QObject和公共QGraphicsPixmapItem。該列表還包含幾個來自類型(B *)的對象。

+0

請使其[MCVE(http://stackoverflow.com/help/mcve)..請另一個項目的代碼觸發你的問題的代碼量最少..有很多代碼缺失(什麼是我的CardDeck,spc :: cardNo ...).. btw多個ifs看起來很可怕 – nayana

+0

@otopolsky這裏是編輯。這正是我正在做的。 – Athena

+0

你有沒有類似'scene-> addItem(new Test(scene))''的代碼?沒有@otopolsky要求的[mcve](http://stackoverflow.com/help/mcve),任何人都可以做的就是猜測。 –

回答

0

我會做這個,檢查沒時間,如果它編譯等。把它當作一半的答案 - 但它仍然可以幫助你..

您的問題:

  1. 不包含現場在您的測試類 - 這是architectionally錯誤, 你可以做到這一點其他地方更高的邏輯..
  2. 還留着測試類外部列表..也許我不明白你的意圖
  3. 隨時撥打父母的構造函數中你的構造函數..有各種各樣的原因 - 請注意,當你有一個參數時,它可能被不正確地轉換並調用父構造函數等等。也許這會導致你的構造函數中有指向場景的參數,這個參數可能被傳遞給QObject constructor (然後使用明確的關鍵字 - 它更安全) - 這些東西是棘手的..當你有多重繼承,我會建議總是手動調用父構造函數,因爲我也 - 檢查this
  4. 爲什麼你從QObject繼承?保持你的邏輯出圖形類..我認爲有一種方法如何處理沒有信號的鼠標點擊事件(但我現在懶惰搜索)。

-

class Test : public QObject, public QGraphicsPixmapItem 
{ 
Q_OBJECT 
public: 
    Test(QObject *qparent = 0, QGraphicsItem *parent = 0) 
    : QObject(qparent) 
    , QGraphicsPixmapItem(parent) { 
     setPixmap(QPixmap("a.jpg")); 
     setPos(0, 0); 
    } 
    void mousePressEvent(QGraphicsSceneMouseEvent *event) { 
     emit mousePressed(); 
    } 
signals: 
    void mousePressed(); 
} 

然後在你的窗口類的地方:

WindowClass(etc) : Parent(etc) { //constructor 
    QGraphicsScene *scene = new ....; 
    Test *test = new Test(this, 0);//can be better, lazy to think of the details 
    connect(test, SIGNAL(mousePressed()), this, SLOT(on_testMousePressed()); 
    scene->addItem(test); 
} 

void on_testMousePressed() { 
    list.push_back(new A(QPixmap("b.png"))); 
    scene->addItem(list.back());   
} 
+0

感謝您的建議。我會記住他們。不幸的是,他們都沒有在我的情況下工作:( – Athena

+0

@Ahena如果你想發佈你的整個項目的某個地方,我可以試試看..你也可以重新發布,如果你現在得到不同的錯誤等。 – nayana

+0

你可以按照我的github帳戶中的項目 – Athena

相關問題