繁体   English   中英

如果销毁了堆分配的对象并重新分配了指针,Qt的Signal and Slots系统是否可以工作?

[英]Will Qt's Signal and Slots system work if a heap-allocated object gets destroyed and the pointer reassigned?

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

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

sceneQGraphicsScene* 在某一时刻,我想删除场景,并用另一个QGraphicsScene代替它。 因此, scene指向的位置将发生变化。

信号仍然可以工作并重新路由到新场景吗?

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

如果要处理场景的新实例,则必须将插槽连接到该新实例。 新场景的插槽也是如此,必须绑定到...好吧,无论您的软件中有什么意义。

销毁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
  }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM