您的位置:首页 > 编程语言 > Qt开发

Qt遍历控件

2016-02-26 13:02 477 查看
最近做的一个Qt程序想加入一些扩展性,想让界面里的控件可以添加删除,而不需要改动程序代码。这就需要加入一些通用处理代码,基础就是可以遍历控件,或者可以按照名字(保存在字符串中)得到控件的指针。而字符串可以从外部配置文件中动态获取,不用重新编译项目。

Qt中有两种获取子控件的方式,一种是模板函数,另一种不区分类型,返回QList。

1. QObject::findChild

1template<typename T> T QObject::findChild ( const QString &name = QString() ) const
根据name返回相应的T类型控件指针。2. QObject::findChildren

1

template<typename
T>
QList<T>
QObject::findChildren
(
const
QRegExp
®Exp
)
const

根据类型和正则表达式返回控件指针列表。

3. QObject::children

1const QObjectList & QObject::children () const
返回所有的子控件。前两种方式需要知道控件的类型,而第三种方法返回的指针都是QObject,需要判断控件的具体类型才能转换成相应的控件并使用。Qt提供很好的机制来实现这个功能:Qt Meta-Object System。QObject::metaObject()返回QMetaObject对象,利用该对象可以得到类型相关信息。QMetaObject::className()返回对象的类型。QObject::children()得到的指针可以根据对象类型名提升为实际的子类指针。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

QGroupBox*
cur_groupbox=findChild<QGroupBox*>("gb_"+prefix+cur_group);

if(!cur_groupbox)

continue;

const
QObjectList
list=cur_groupbox->children();

foreach(QObject*
obj,list)

{

QString
class_name=QString::fromAscii(obj->metaObject()->className());

if(class_name=="QCheckBox")

{

QCheckBox*
cb=(QCheckBox*)obj;

QString
object_name
=
cb->objectName();

QString
key=object_name.mid(QString("cb_"+prefix).length(),-1);



QString
var
=
get_script_manager->value(config_name,


"/configuration/group[@name="+cur_group+"]/item[@name="+key+"]/value").toString();

if(var==tr("YES")
||
var==tr("yes"))

{

cb->setChecked(true);

}

else
if(var==tr("NO")
||
var==tr("no"))

{

cb->setChecked(false);

}

}

if(class_name=="QLineEdit")

{

QLineEdit*
le=(QLineEdit*)obj;

QString
object_name
=
le->objectName();

QString
key=object_name.mid(QString("le_"+prefix).length(),-1);

QString
var
=
get_script_manager->value(config_name,

"/configuration/group[@name="+cur_group+"]/item[@name="+key+"]/value").toString();



le->setText(var);

}

}



上例中我只需要处理QCheckBox和QLineEdit两种的控件,当然这两种控件的处理方式有一些相近的地方,可以简化代码,但我还没什么具体的想法,跪求指导啊。
FROM: http://windrocblog.sinaapp.com/?p=799 ================================================


QT如何遍历控件,并依次获取控件的值啊

QT如何去获取界面上所有控件的类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: