C++ 向QGraphicscene添加项时的两个错误

C++ 向QGraphicscene添加项时的两个错误,c++,qt,C++,Qt,我正在尝试使用qt开发一个项目,但在向场景添加项目时,我遇到了两个问题! 我有一个包含背景对象的类,它在其构造函数中获取指向场景的指针 我尝试了“场景->添加项(此)”将背景添加到场景中。但是,在运行项目时,据报告该项目已添加到场景中!这里是我唯一调用addItem的地方 我还尝试创建一些类的新对象,并将它们放在QList中。添加这些项目时,这些项目根本不会出现在场景中 下面是课堂: class Test : public QObject, public QGraphicsPixmapItem{

我正在尝试使用qt开发一个项目,但在向场景添加项目时,我遇到了两个问题! 我有一个包含背景对象的类,它在其构造函数中获取指向场景的指针

  • 我尝试了“场景->添加项(此)”将背景添加到场景中。但是,在运行项目时,据报告该项目已添加到场景中!这里是我唯一调用addItem的地方

  • 我还尝试创建一些类的新对象,并将它们放在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的类,B本身继承公共QObject和公共QGraphicsPixmapItem。该列表还包含来自类型(B*)的两个对象。

    我会这样做,没有时间检查它是否编译等。。把它当作半个答案——但它仍然可以帮助你

    您的问题:

  • 不要在测试类中包含场景-这在体系结构上是错误的, 你可以在更高逻辑的其他地方这样做
  • 同时,将列表保留在测试类之外。。或者我不明白你的意图
  • 始终在构造函数中调用父构造函数。。有多种原因-请注意,当您有一个参数时,它可以不正确地转换并调用父构造函数等。。这可能会导致构造函数中出现问题,该构造函数具有指向场景的指针参数,该参数可能被传递给QObject construcor(然后使用explicit关键字,这样更安全),这些事情很棘手。。当您有多重继承时,我建议您总是像我一样手动调用父构造函数-还要检查
  • 你为什么从QObject继承?将您的逻辑排除在图形类之外。。我认为有一种方法可以在没有信号的情况下处理鼠标点击事件(但我现在懒得搜索)
  • --

    然后在窗口类中的某个地方:

    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());        
    }
    

    我会这样做,没有时间检查它是否编译等。。把它当作半个答案——但它仍然可以帮助你

    您的问题:

  • 不要在测试类中包含场景-这在体系结构上是错误的, 你可以在更高逻辑的其他地方这样做
  • 同时,将列表保留在测试类之外。。或者我不明白你的意图
  • 始终在构造函数中调用父构造函数。。有多种原因-请注意,当您有一个参数时,它可以不正确地转换并调用父构造函数等。。这可能会导致构造函数中出现问题,该构造函数具有指向场景的指针参数,该参数可能被传递给QObject construcor(然后使用explicit关键字,这样更安全),这些事情很棘手。。当您有多重继承时,我建议您总是像我一样手动调用父构造函数-还要检查
  • 你为什么从QObject继承?将您的逻辑排除在图形类之外。。我认为有一种方法可以在没有信号的情况下处理鼠标点击事件(但我现在懒得搜索)
  • --

    然后在窗口类中的某个地方:

    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());        
    }
    

    请去吧。。创建另一个项目,使触发问题的代码量尽可能少。。缺少很多代码(什么是myCardDeck,spc::cardNo…)。。顺便说一句,多个ifs看起来horrible@otopolsky这是编辑。这正是我正在做的。您是否有类似于
    scene->addItem(新测试(场景))
    的代码?如果没有@otopolsky要求的答案,任何人都只能猜测。@G.M.不,我没有,我也没有为它设置任何家长。请做吧。。创建另一个项目,使触发问题的代码量尽可能少。。缺少很多代码(什么是myCardDeck,spc::cardNo…)。。顺便说一句,多个ifs看起来horrible@otopolsky这是编辑。这正是我正在做的。您是否有类似于
    scene->addItem(新测试(场景))
    的代码?如果没有@otopolsky要求的答案,任何人都只能猜测。@G.M.不,我没有,我也没有为此设置任何家长。谢谢推荐。我会记住的。不幸的是,在我的情况下,他们都不起作用:(@Athena,如果你想把你的整个项目发布到某个地方,我可以试试。如果你现在有不同的错误,你也可以重新发布。你可以在我的github帐户中跟踪这个项目。是吗?有很多文件。奇怪的目录结构。但是无论如何,如果我有时间,我会看看it@Athena你至少可以告诉我哪些课程是你有问题的那个…谢谢你的建议。我会记住的。不幸的是,在我的情况下,没有一个有效:(@Athena,如果你想把你的整个项目发布到某个地方,我可以试试。如果你现在有不同的错误,你也可以重新发布。你可以在我的github帐户中跟踪这个项目。是吗?有很多文件。奇怪的目录结构。但是无论如何,如果我有时间,我会看看it@Athena你至少可以告诉我哪些课程是你有问题的那个。。