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)
4

2 回答 2

3

你有没有检查过你打电话时parentItem()没有回来?听起来可能是在构造函数之后设置了父项,这意味着确实会返回。我怀疑这可能就是 Qt Designer 的运行方式。如果是这样,您将需要在构造函数之外连接信号/插槽,或者在另一种方法中(在构造函数内部未调用的方法),或者完全在子节点之外。NULLQObject::connect()parentItem()NULL

于 2012-05-24T13:35:48.377 回答
1

根据消息,

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

导致

(null)::setCurrentIndex(int)

这意味着parentWidget()NULL

这基本上意味着表单不是QStackedWidget. 如果您手动创建表单,则必须执行以下操作

MyForm *form = new MyForm( ui->stackedWidget );
于 2012-05-24T14:23:38.903 回答