如果堆分配的对象被破坏并且指针被重新分配,那么Qt的信号和插槽系统是否会工作?

时间:2016-05-29 19:13:31

标签: c++ qt signals signals-slots

我有这样的信号和插槽连接:

QGraphicsScene* scene = new QGraphicsScene;
//...
connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), scene, SLOT(doSomething(int)));
//...
delete scene;
scene = new QGraphicsScene;
//...

sceneQGraphicsScene*。有一次,我想删除场景并将其替换为另一个QGraphicsScene。因此scene指向的位置将发生变化。

信号是否仍然有效并重新路由到新场景?

3 个答案:

答案 0 :(得分:2)

信号和插槽涉及类的实例。无论何时将信号连接到插槽,都会涉及两个QObject派生类的实例(connect需要两个指向QObject的指针才能工作)。

如果您正在处理场景的新实例,则必须将插槽连接到此新实例。这同样适用于新场景的插槽,必须绑定到......好吧,无论你的软件有什么意义。

答案 1 :(得分:2)

printf()的破坏会导致其所有信号和插槽自动断开连接。

答案 2 :(得分:1)

  

信号是否仍然有效并重新路由到新场景?

不,他们不会,因为你重新创建一个场景的事实只与你有关。从Qt的角度来看,你正在创造一个全新的,无关的对象。 “老”场景和“新”场景之间没有任何关联 - 除了在你的脑海中,就是这样。

但你不需要新的场景。您可以清除现有的:

#include "MyWidget_ui.h"

class MyWidget : public QWidget { // Not QMainWindow unless you need it
  Ui::MyWidget ui; // You hold the ui by value.
  QGraphicsScene m_scene;
public:
  MyWidget(QWidget * parent = 0) :
    QWidget(parent)
  {
    ui.setupUi(this);
    connect(ui.comboBox, &QComboBox::currentIndexChanged,
            &m_scene, &QGraphicsScene::doSomething);
  }
  void test() {
    m_scene.clear();
    // scene is ready to use
  }
};