Qt每天一个小技巧之QObject ::children 以及对应findChildren

说好的计划,就要实现,今年我要把吹过的牛皮,设定的计划,统统给圆了。

打开Qt帮助文档,下个小技巧就是children 函数啦。

与children 对应的还有findChild、findChildren等函数,今天就带大家一起来记录这个小技巧。

QObject 以对象树的形式组织起来。当为一个对象创建子对象时,子对象会自动地添加到父对象的children()列表中。父对象拥有子对象的所有权,比如父对象可以在自己的析构函数中删除它的孩子对象。使用findChild()或findChildren()通过名字和类型查询孩子对象。

children()

我们创建了一个工程,MainWindow,我们简单的向上托放两个控件,如下图:

然后我们在构造函数中使用children函数,看看会有什么效果。

    QObjectList childlist = this->children(); //获取子类列表
    int length =  childlist.length();
    qDebug()<< length << endl;

    for(auto list:childlist)
    {
        qDebug()<< list << endl;
    }

输出结果:

我们会发现,为啥没有托上去的两个控件的对象呢。这里一定要记住children返回的当前父类对应的子类,当前的父类只有上面5个子类。然而我们托上去按钮他们的父类是centralWidget。

我们在加代码,验证一下是不是这个原因:

   QObjectList child2 = ui->centralWidget->children();
    for(auto list:child2)
    {
        qDebug()<< list << endl;
    }

输出: 

看来我们的验证是对的。

findChildren()

返回该对象的所有具有可转换为类型T的给定名称的子对象,

如果没有这样的对象,则为空列表。省略name参数将导致匹配所有对象名称。搜索是递归执行的,除非选项指定FindDirectChildrenOnly选项。

 我们使用代码来查找:

void MainWindow::on_pushButton_clicked()
{
    QPushButton * btn = this->findChild<QPushButton *>("pushButton");
    qDebug()<< btn->objectName() << endl;
     QPushButton * btn2 = this->findChild<QPushButton *>("pushButton1");
     if(btn2)
     {
          qDebug()<< btn2->objectName() << endl;
     }
     else
     {
          qDebug()<< "no btn2" << endl;
     }

}

输出结果:

然后我们了解这些功能性,文档给我们很多例子:

 QList<QWidget *> widgets = parentWidget.findChildren<QWidget *>("widgetname");
 QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();
 QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(QString(), 
 Qt::FindDirectChildrenOnly);

这里可以查找很多同类型的,放入一个列表中,我们可以对他处理。

我们又加了4个QLineEdit 的控件,我们可以同时对4个进行操作。

     QList<QLineEdit*> nline = this->findChildren<QLineEdit*>(); //获取此类的全部
     for(auto line : nline)
     {
         line->setText("比卡丘不皮");
     }

输出结果: 

 是不是很香,还可以在一个对应的全部链接槽,这样就并不需要每个都写一个槽,一次性多个操作就是香。

喜欢的朋友可以关注我的博客,让我们每天都在进步。明天不见不散。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值