向 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 添加项目