一般用Qt写软件,使用designer创建一个窗口,拖几个控件进行一下布局就够用了,但有些需求,需要自定义各种类型的控件,并且很多控件需要根据数据的交互,动态的添加和删除,为此学习了一下Qt的实现方法,在此记录之。
方法是,使用布局的addWidget函数添加控件,删除时使用removeWidget函数,需要设置控件的deleteLater属性,也可以使用delete直接删除。
void ConItem01::checkClick(bool state)
{
QCheckBox *chk = (QCheckBox *)sender(); //转换成指定的类
QString objName = chk->objectName(); //得到发出信号的对象名
if (objName == "chk1") {
if(state){ //根据状态选择增加或者删除控件
Frame *fm = new Frame; //初始化一个自定义的控件类
fm->setObjectName(tr("1#")); //设置新增对象名称
fm->setTitle(1); //自定义函数
ui->verticalLayout->addWidget(fm); //添加到水平布局(这里根据需要选择布局)
}else{
Frame *fm = ui->scrollArea->findChild<Frame*>("1#"); //找到指定名称的控件
ui->verticalLayout->removeWidget(fm); //移除控件
fm->deleteLater();
//delete fm; //使用delete也可以
}
<span style="font-family: Arial, Helvetica, sans-serif;">}</span><span style="font-family:Arial, Helvetica, sans-serif;">}</span>
其中,需要注意:
1、新增的控件名称不要重复,以免自己删除时找不到;
2、在需要动态增减控件的部件上添加一个布局控件,然后在布局上增减控件,这样部件大小会跟着变化;
3、新增的控件一定要设置一个控件大小的最小宽和高,不然加入布局就缩到最小了;
4、删除时找指定控件,一定要在部件上找,不要在布局上,否则程序会崩溃;
5、如果有多处操作会删除控件,在分findChild函数后加上指针为空判断,防止程序崩溃。
效果图: