2012-05-24 118 views
0

我以为我开始明白这一点,但似乎没有。无法连接到家长插槽

我正在尝试将堆叠的小部件连接在一起,以便孩子可以向父母发送消息以告知其更改视图。 QStackedWidget是主窗口的子项,它的页面是我自己创建的促销项目。我认为这是正确的做法吗?

左右的时间内一个孩子形成我试过如下:

// Set up a mapping between the buttons and the pages 
QSignalMapper *mapper = new QSignalMapper(this); 

mapper->setMapping(ui->automatedButton, 1); // Value of the index 
connect(ui->automatedButton, SIGNAL(clicked()), mapper, SLOT(map())); 

connect(mapper, SIGNAL(mapped(int)), ((QStackedWidget*)parentWidget()), SLOT(setCurrentIndex(int))); 

但是,这似乎并没有工作。我点击按钮,没有任何变化。但是,如果我这样做:

void MySelectionForm::on_automatedButton_clicked() 
{ 
    ((QStackedWidget*)parentWidget())->setCurrentIndex(1); 
} 

我以为和我以前做的一样吗?

QObject::connect: Cannot connect QSignalMapper::mapped(int) to (null)::setCurrentIndex(int) 

回答

3

是否检查parentItem()没有返回NULL当你调用QObject::connect()

我上运行的消息,我猜是相关时,看到了吗?这听起来像也许父项构造函数,这将意味着parentItem()确实会返回NULL。我怀疑这可能是Qt Designer的推出方式。如果是这样,你需要在构造函数之外连接信号/插槽,或者使用另一个方法(不在构造函数内部调用的方法),或者完全在孩子的外部。

+0

啊,这是非常有用的。我将表单从设计器中移出,并在MainWindow构造函数中手动添加它们,将父项设置为堆叠容器,现在按预期方式工作。可能还有另外一种方法可以通过设计师来完成,但现在可以直到我解决问题,所以谢谢! – Firedragon

1

根据该消息,

((QStackedWidget*)parentWidget()), SLOT(setCurrentIndex(int))); 

导致

(null)::setCurrentIndex(int) 

这意味着parentWidget()NULL

这基本上意味着表格不是QStackedWidget的孩子。 如果你手动创建你的表单,你必须这样做

MyForm *form = new MyForm(ui->stackedWidget); 
+0

我没有手动完成它们,虽然我的意思是他们会没事的,但可能是因为我是如何创建它们的。在框架中花更多时间,这可能很容易。我按照你提到的手动创建了它们,而且确实有效。 – Firedragon