我有这样的信号和插槽连接:
QGraphicsScene* scene = new QGraphicsScene;
//...
connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), scene, SLOT(doSomething(int)));
//...
delete scene;
scene = new QGraphicsScene;
//...
scene
是QGraphicsScene*
。有一次,我想删除场景并将其替换为另一个QGraphicsScene
。因此scene
指向的位置将发生变化。
信号是否仍然有效并重新路由到新场景?
答案 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
}
};