2016-07-14 4 views
1

Я пытаюсь разработать проект с использованием qt, но у меня возникли две проблемы как для добавления элементов в сцену! У меня есть класс, содержащий мой фоновый объект, и он получает указатель на мою сцену в своем конструкторе.две ошибки при добавлении элементов в QGraphicsScene

  1. Я попробовал «scene-> addItem (this)», чтобы добавить фон к сцене. однако при запуске проекта сообщается, что элемент уже добавлен в сцену! вот единственное место, где я вызываю 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; 
} 

P.S. A - класс, наследующий B, который сам наследует открытый QObject и открытый QGraphicsPixmapItem. Список также содержит пару объектов типа (B *).

+0

пожалуйста, сделать его [mcve] (http://stackoverflow.com/help/mcve) .. Сделать другой проект с наименьшим количеством кода, вызывающим вашу проблему .. есть много недостающего кода (что такое myCardDeck, spc :: cardNo ...) .. btw несколько ifs выглядит ужасно – nayana

+0

@otopolsky Вот это и право. Это именно то, что я делаю. – Athena

+0

Есть ли у вас код, похожий на «scene-> addItem (новый тест (сцена))? Без [mcve] (http://stackoverflow.com/help/mcve) в соответствии с просьбой @otopolsky, лучшее, что может сделать, это догадываться. –

ответ

0

Я хотел бы сделать это, нет времени, чтобы проверить, если он компилирует и т.д .. принять его как половину ответа, - но все же он может помочь вам ..

Ваших проблем:

  1. не содержит сцены в классе Test - это architectionally неправильно, вы можете сделать это в другом месте в высших логиках ..
  2. также сохранить список за пределами класса Test .. или, может быть, я не понимаю ваше намерение
  3. всегда называют родитель конструкторов в ваш конструктор. Существуют разные причины: имейте в виду, что когда у вас есть один параметр, он может быть преобразован с помощью метода и вызвать родительский конструктор и т. д. возможно, это вызвало проблемы в вашем конструкторе, который имел параметр указателя на сцену, который, возможно, был передан в конструкцию QObject (тогда используйте явное ключевое слово - его гораздо безопаснее) - эти вещи сложны. Если у вас есть множественное наследование, я бы посоветовал всегда вызывать родительские конструкторы вручную, как и я, - также проверить 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

@Athena, если вы хотите, чтобы где-то был весь ваш проект, и я могу попробовать.также вы можете отправить сообщение, если у вас появятся разные ошибки сейчас и т. д. – nayana

+0

вы можете следить за проектом в моей учетной записи github – Athena

Смежные вопросы