如何动态地添加/删除控件

前言

  使用一个简单的例子,实现动态地添加/删除控件,效果图:
效果图

UI界面

  在ui文件中添加一个添加按键和一个垂直布局器,该布局器内放置了弹簧。当添加按键按下之后,新增的按键会添加至该布局器内。
ui文件

代码实现

  为了使代码更简单易理解,结合本例的需求:单击添加按键时,创建新控件;单击删除按键时,删除对应的控件。我们这里只需要实现两个回调函数,分别是添加按键的回调函数,主要负责创建新的控件,以及删除按键的回调函数,用于删除对应的控件。

  • 添加按键的回调函数
void MainWindow::on_pushButton_clicked()
{
	//生成新按钮
    QPushButton *nBtn = new QPushButton(this);
    QString btn_text = QString("Count%1").arg(ui->verticalLayout->count());
    nBtn->setText(btn_text);
    //往布局器中插入新按钮
    ui->verticalLayout->insertWidget(0, nBtn);
    //设置该按钮的槽函数,用于删除对应的控件
    connect(nBtn, &QPushButton::clicked, this, &MainWindow::delBtn_clicked);
}

  该回调函数创建了一个新的控件(这里使用的是按钮,可以换成其他任意的控件),使用布局器的接口insertWidget 将新生成的控件添加在布局器的开头。这是因为insertWidget 的第一个参数决定了插入控件的位置,此处设置为0。最后设置了控件对应的回调函数,用于删除控件。

  • 删除按键的回调函数
void MainWindow::delBtn_clicked()
{
    QPushButton *Btn = qobject_cast<QPushButton *>(sender());
    ui->verticalLayout->removeWidget(Btn);
    delete Btn;
}

  删除按键的回调函数也十分简单,只有肉眼可见的三行代码,但蕴含的知识点却是无限。第一,使用sender()函数来获取发生按下动作的按键。之后调用布局器的removeWidget函数将删除按键移除。最后,释放掉占用的控件,一气呵成。

进阶

  上面讲的只是针对动态增加和删除一个控件,但实际应用过程中,也许面对的并不只是一个简简单单的一个控件,或者是一个布局器,里面包含了多种控件。这种情况,应当如何实现动态增加/删除呢。下回解析。。。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐