在QT中,如何在收到子部件产生的信号后从父部件中删除子部件?
In QT, how to remove child widget from parent after receiving the signal generated by child?
在QT中,如何在接收到child产生的信号后从parent移除child widget?
我正在使用 QT 5.7 并编写了一个包含 2 个小部件、view1 和 view2 的简单程序。在 view1 中有一个名为 "btn_1" 的按钮,在 view2 中有一个名为 "btn_leave" 的按钮。
当你点击"btn_1"时,它会生成一个view2对象并将其添加到view1的布局中。我希望在单击 "btn_leave" 时删除 view2。
这是我的想法。在 view2 中单击 leave_btn 时,它会发出一个名为 "leave" 的信号。我将此信号连接到 lambda 函数以删除 view2。
void VIEW1::on_btn_1_clicked() {
VIEW2 *view2 = new VIEW2();
layout->addWidget(view2);
connect(view2, &VIEW2::leave, this, [&view2]() {
delete view2;
});
}
程序崩溃并不奇怪,因为我在 view2 发出信号时删除了 view2。 view2 可以在发出离开信号后访问其成员。
所以我用deleteLater重写了它。根据QT文档,当控制returns进入事件循环时对象将被删除。
void VIEW1::on_btn_1_clicked() {
VIEW2 *view2 = new VIEW2();
layout->addWidget(view2);
connect(view2, &VIEW2::leave, this, [&view2]() {
view2.deleteLater();
});
}
但令人惊讶的是,程序又崩溃了。我对 deleteLater 的用法有什么误解,或者在调用 deletelater() 后事件队列访问 view2 中仍然有一些事件?
如果有帮助,我已将我的整个程序(使用 QT creator 创建)上传到 github。
你要传递view2
的指针,而不是指针的指针,另外this
没必要
void VIEW1::on_btn_1_clicked() {
VIEW2 *view2 = new VIEW2();
layout->addWidget(view2);
connect(view2, &VIEW2::leave, [view2]() {
view2->deleteLater();
});
}
或者干脆不使用 lambda 函数,而是 new connection style:
void VIEW1::on_btn_1_clicked() {
VIEW2 *view2 = new VIEW2();
layout->addWidget(view2);
connect(view2, &VIEW2::leave, view2, &VIEW2::deleteLater);
}
另一种选择是不创建 leave
信号,并连接点击的信号
VIEW2::VIEW2(QWidget *parent) :
QWidget(parent)
{
label = new QLabel(this);
label->setText("view2");
btn_leave = new QPushButton(this);
btn_leave->setText("leave");
layout = new QHBoxLayout;
layout->addWidget(label);
layout->addWidget(btn_leave);
setLayout(layout);
connect(btn_leave, &QAbstractButton::clicked, this, &VIEW2::deleteLater);
}
在QT中,如何在接收到child产生的信号后从parent移除child widget?
我正在使用 QT 5.7 并编写了一个包含 2 个小部件、view1 和 view2 的简单程序。在 view1 中有一个名为 "btn_1" 的按钮,在 view2 中有一个名为 "btn_leave" 的按钮。
当你点击"btn_1"时,它会生成一个view2对象并将其添加到view1的布局中。我希望在单击 "btn_leave" 时删除 view2。
这是我的想法。在 view2 中单击 leave_btn 时,它会发出一个名为 "leave" 的信号。我将此信号连接到 lambda 函数以删除 view2。
void VIEW1::on_btn_1_clicked() {
VIEW2 *view2 = new VIEW2();
layout->addWidget(view2);
connect(view2, &VIEW2::leave, this, [&view2]() {
delete view2;
});
}
程序崩溃并不奇怪,因为我在 view2 发出信号时删除了 view2。 view2 可以在发出离开信号后访问其成员。
所以我用deleteLater重写了它。根据QT文档,当控制returns进入事件循环时对象将被删除。
void VIEW1::on_btn_1_clicked() {
VIEW2 *view2 = new VIEW2();
layout->addWidget(view2);
connect(view2, &VIEW2::leave, this, [&view2]() {
view2.deleteLater();
});
}
但令人惊讶的是,程序又崩溃了。我对 deleteLater 的用法有什么误解,或者在调用 deletelater() 后事件队列访问 view2 中仍然有一些事件?
如果有帮助,我已将我的整个程序(使用 QT creator 创建)上传到 github。
你要传递view2
的指针,而不是指针的指针,另外this
没必要
void VIEW1::on_btn_1_clicked() {
VIEW2 *view2 = new VIEW2();
layout->addWidget(view2);
connect(view2, &VIEW2::leave, [view2]() {
view2->deleteLater();
});
}
或者干脆不使用 lambda 函数,而是 new connection style:
void VIEW1::on_btn_1_clicked() {
VIEW2 *view2 = new VIEW2();
layout->addWidget(view2);
connect(view2, &VIEW2::leave, view2, &VIEW2::deleteLater);
}
另一种选择是不创建 leave
信号,并连接点击的信号
VIEW2::VIEW2(QWidget *parent) :
QWidget(parent)
{
label = new QLabel(this);
label->setText("view2");
btn_leave = new QPushButton(this);
btn_leave->setText("leave");
layout = new QHBoxLayout;
layout->addWidget(label);
layout->addWidget(btn_leave);
setLayout(layout);
connect(btn_leave, &QAbstractButton::clicked, this, &VIEW2::deleteLater);
}