如果堆分配的对象被销毁并且指针被重新分配,Qt的信号和插槽系统会工作吗?



我有一个信号和插槽连接,如下所示:

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

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

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

破坏

QObject会导致其所有信号和插槽自动断开连接。

信号和插槽涉及类的实例。 每当将信号连接到插槽时,都会涉及QObject派生类的两个实例(connect需要两个指针来QObject工作)。

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

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

不,它们不会,因为您重新创建场景的事实仅与您相关。从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
  }
};

最新更新