最近做的一个Qt程序想加入一些扩展性,想让界面里的控件可以添加删除,而不需要改动程序代码。这就需要加入一些通用处理代码,基础就是可以遍历控件,或者可以按照名字(保存在字符串中)得到控件的指针。而字符串可以从外部配置文件中动态获取,不用重新编译项目。
Qt中有两种获取子控件的方式,一种是模板函数,另一种不区分类型,返回QList。
1. QObject::findChild
1
|
template
<
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
1
|
const
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如何去获取界面上所有控件的类型QObjectList list = children();
QPushButton *b;
foreach (QObject *obj, list) {
b = qobject_cast<QPushButton*>(obj);
if
(b){
qDebug() << b->rect();
}
}