向 QGraphicsScene 添加项目的两个错误

Posted

技术标签:

【中文标题】向 QGraphicsScene 添加项目的两个错误【英文标题】:two bugs in adding items to a QGraphicsScene 【发布时间】:2016-07-14 08:46:07 【问题描述】:

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

    我尝试使用“scene->addItem(this)”将背景添加到场景中。但是,在运行项目时,据报道该项目已经添加到场景中!这是我唯一调用 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;

附: A 是继承 B 的类,它本身继承公共 QObject 和公共 QGraphicsPixmapItem。该列表还包含几个来自 type(B *) 的对象。

【问题讨论】:

请将其设为mcve.. 使用最少的代码量来创建另一个项目来触发您的问题.. 缺少很多代码(什么是 myCardDeck、spc::cardNo ... )。 . 顺便说一句,多个 if 看起来很可怕 @otopolsky 这是编辑。这正是我正在做的。 你有类似scene->addItem(new Test(scene))的代码吗?如果没有@otopolsky 要求的mcve,那么任何人都可以做的最好的事情就是猜测。 @G.M.不,我没有,我也没有为它设置任何父母。 【参考方案1】:

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

你的问题:

    在您的测试类中不包含场景 - 这在架构上是错误的, 您可以在更高逻辑的其他地方执行此操作.. 还将列表保留在测试类之外.. 或者我不明白你的意图 总是在你的构造函数中调用父构造函数。有多种原因 - 请注意,当你有一个参数时,它可能会被不正确地转换并调用父构造函数等。这可能会导致你的构造函数出现问题,它有指针参数到可能被传递给 QObject 构造函数的场景(然后使用显式关键字——这样会更安全)——这些事情很棘手。当你有多重继承时,我建议总是像我一样手动调用父构造函数——还要检查this 为什么要从 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());        

【讨论】:

感谢您的建议。我会记住他们。不幸的是,它们都不适用于我的情况:( @Athena 如果您想在某个地方发布您的整个项目,我可以尝试一下。如果您现在遇到不同的错误等,您也可以重新发布。 你可以关注我的github账号中的项目 是this one .. 很多文件.. 奇怪的目录结构.. 但无论如何,如果我有时间我会看看它 @Athena 你至少可以告诉我哪些课程是你遇到问题的课程。

以上是关于向 QGraphicsScene 添加项目的两个错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 QGraphicsScene::addItem 将 QPixmap 项目添加到 QGraphicsScene 会导致 PySide 崩溃

C++ - 从 QPushButton 向 QListWidget 添加项目

如何在 QGraphicsScene 上进行选择?

Qt:选择的项目出现在 QGraphicsScene 的顶部

将 QWidget 添加到 QGraphicsScene

qt - 在 QGraphicsScene 中如何捕捉特定项目