——2021 0408——
最近发现Qt中有一个函数可以遍历某种类型的界面控件:
QList<QPushButton*> btns = findChildren<QPushButton*>();
缺省就是递归调用的,所以,如果只是提取某一类控件,可以采用这种方式;
————————
查看了网络上常用的遍历控件代码,很有启发,不过,因为Qt界面类往往有很多层,用网上提到的方法通常只能遍历一层,也就是说,当获取父节点的时候,只能遍历子节点,子节点以下的节点,无法获取到了。
所以,改进后的遍历方法是,先采用递归函数,获取界面上的控件;然后,从这些控件中,提取自己需要的控件;
代码如下:
/* 获取所有控件 */
QObjectList getAllUIControls(QObject* parent)
{
QObjectList lstOfChildren, lstTemp;
if (parent)
{
lstOfChildren = parent->children();
}
if (lstOfChildren.isEmpty())
{
return lstOfChildren;
}
lstTemp = lstOfChildren; /* 这里要注意,如果不拷贝原先的list,直接使用,会有问题; */
foreach(QObject* obj, lstTemp)
{
QObjectList lst = getAllUIControls(obj);
if (!lst.isEmpty())
{
lstOfChildren.append(lst);
}
}
return lstOfChildren;
}
/* 获取界面上所有按钮;
当然也可以是所有的lineEdit或其他;
*/
QObjectList getAllButtons(QObjectList lstUIControls)
{
QObjectList lstOfButtons;
for each (QObject* obj in lstUIControls)
{
if (obj->metaObject()->className() == QStringLiteral("QPushButton"))
{
lstOfButtons.append(obj);
}
}
return lstOfButtons;
}
/*调用时,可以在界面所在类这样调用*/
QObjectList listOfButton = getAllButtons(getAllUIControls(this));
/* ---------------------------------------我是分隔线-------------------------------------- */
这样就可以获取界面上所有的按钮了;