说好的计划,就要实现,今年我要把吹过的牛皮,设定的计划,统统给圆了。
打开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("比卡丘不皮");
}
输出结果:
是不是很香,还可以在一个对应的全部链接槽,这样就并不需要每个都写一个槽,一次性多个操作就是香。
喜欢的朋友可以关注我的博客,让我们每天都在进步。明天不见不散。