Qt遍历控件
2016-02-26 13:02
477 查看
最近做的一个Qt程序想加入一些扩展性,想让界面里的控件可以添加删除,而不需要改动程序代码。这就需要加入一些通用处理代码,基础就是可以遍历控件,或者可以按照名字(保存在字符串中)得到控件的指针。而字符串可以从外部配置文件中动态获取,不用重新编译项目。
Qt中有两种获取子控件的方式,一种是模板函数,另一种不区分类型,返回QList。
1. QObject::findChild
根据name返回相应的T类型控件指针。2. QObject::findChildren
根据类型和正则表达式返回控件指针列表。
3. QObject::children
返回所有的子控件。前两种方式需要知道控件的类型,而第三种方法返回的指针都是QObject,需要判断控件的具体类型才能转换成相应的控件并使用。Qt提供很好的机制来实现这个功能:Qt Meta-Object System。QObject::metaObject()返回QMetaObject对象,利用该对象可以得到类型相关信息。QMetaObject::className()返回对象的类型。QObject::children()得到的指针可以根据对象类型名提升为实际的子类指针。
上例中我只需要处理QCheckBox和QLineEdit两种的控件,当然这两种控件的处理方式有一些相近的地方,可以简化代码,但我还没什么具体的想法,跪求指导啊。
FROM: http://windrocblog.sinaapp.com/?p=799 ================================================
QT如何去获取界面上所有控件的类型
Qt中有两种获取子控件的方式,一种是模板函数,另一种不区分类型,返回QList。
1. QObject::findChild
1 | template<typename T> T QObject::findChild ( const QString &name = QString() ) const |
1 | template<typename T> QList<T> QObject::findChildren ( const QRegExp ®Exp ) const |
3. QObject::children
1 | const QObjectList & QObject::children () const |
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); } } |
FROM: http://windrocblog.sinaapp.com/?p=799 ================================================
QT如何遍历控件,并依次获取控件的值啊
QT如何去获取界面上所有控件的类型
相关文章推荐
- Qt获得焦点和失去焦点处理事件 (Focus事件)
- Qt::WA_DeleteOnClose 造成的野指针问题
- Qt5中用QLCDNumber显示时间
- QT 为按钮添加事件
- QT SSL OpenSSL https
- Qt 5.4错误"qt.network.ssl: QSslSocket: cannot call"
- 使用QTextCodec/QString/QByteArray/std::string时中文编码问题
- 使用QTextCodec/QString/QByteArray/std::string时中文编码问题
- Qt tip——初始化窗体Geometry()
- Qt查找子窗口
- Qt获取控件位置,坐标总结
- Qt::FocusPolicy的使用
- Qt中的焦点事件
- Qt键盘事件
- 今天开始学习QT for sysbiam 1
- Qt贪吃蛇(代码裸写,不用creator)
- qt中int与string的相互转换
- QT离线安装包下载地址
- QT 按键
- windows下 QT5编译手记