我以为我开始理解这一点,但似乎没有。
我正在尝试将堆叠的小部件连接在一起,以便孩子们可以向父级发送消息,告诉它更改视图。 QStackedWidget是主窗口的子窗口,它的页面是我自己创建的fomrs。我认为这是正确的方法吗?
因此,在其中一个儿童表格中,我尝试了以下内容:
// 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)
答案 0 :(得分:3)
在致电parentItem()
时,您是否检查过NULL
没有返回QObject::connect()
?听起来好像在构造函数之后设置了父项,这意味着parentItem()
确实会返回NULL
。我怀疑可能是Qt Designer如何推出。如果是这样,你需要在构造函数之外连接信号/槽,或者在另一个方法(一个未在构造函数内部调用的方法)中连接,或者在子项外部连接。
答案 1 :(得分:1)
根据消息,
((QStackedWidget*)parentWidget()), SLOT(setCurrentIndex(int)));
导致
(null)::setCurrentIndex(int)
表示parentWidget()
为NULL
。
这基本上意味着表格不是QStackedWidget
的孩子。
如果您手动创建表单,则必须执行类似的操作
MyForm *form = new MyForm( ui->stackedWidget );