在QT中,接收到子小部件产生的信号后,如何从父小部件中删除子小部件?

  • 本文关键字:小部 删除 信号 QT c++ qt qt5 qt-signals
  • 更新时间 :
  • 英文 :


在QT中,接收到子小部件产生的信号后,如何从父小部件中删除子小部件?

我正在使用 QT 5.7 并编写一个简单的程序,其中包含 2 个小部件,视图 1 和视图 2。视图 1 中有一个名为"btn_1"的按钮,视图 2 中有一个名为"btn_leave"的按钮。

当您单击"btn_1"时,它将生成一个 view2 对象并将其添加到 view1 的布局中。我希望在单击"btn_leave"时删除 view2。

这是我的想法。单击 view2 中的leave_btn时,它会发出称为"离开"的信号。我将这个信号连接到一个 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 可以在发出离开信号后访问其成员。

所以我用删除以后重写它。根据 QT 文档,当控件返回到事件循环时,对象将被删除。

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 创建者创建(上传到 github。

你必须传递view2的指针,而不是指针的指针,除此之外this这是不必要的。

void VIEW1::on_btn_1_clicked() {
    VIEW2 *view2 = new VIEW2();
    layout->addWidget(view2);
    connect(view2, &VIEW2::leave, [view2]() {
        view2->deleteLater();
    });
}

或者干脆不使用lambda函数,而是使用新的连接样式:

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);
}

相关内容

  • 没有找到相关文章

最新更新