目的
Qt的UI界面编程时,会遇到这种情况,界面上分布大量相同的控件,如LineEdit_1、LineEdit_2、LineEdit_3 等一系列控件。对这么多控件进行操作,无疑采用遍历的方式是最好的办法,可是往往这些控件都是在UI设计器里手动添加的,所以并不能立刻得到可批量操作的地址。下面有3种方法可以供操作。
方法1:采用数组
可以声明一系列对应控件类型的指针数组,然后将各个控件的地址复制给指针,然后操作指针数组就可以操作相应的控件。
在 mainwindow.h 中声明 QLineEdit *LineEdit[3]
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QLineEdit> #include <QMainWindow> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; QLineEdit *LineEdit[3]; }; #endif // MAINWINDOW_H
可以在 mainwindow.cpp 中进行地址复制和批量操作
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // LineEdit[0] = ui->lineEdit_1; LineEdit[1] = ui->lineEdit_2; LineEdit[2] = ui->lineEdit_3; // for(quint32 i=0;i!=3;++i){ LineEdit[i]->setText("this's LineEdit "+QString::number(i+1)); } } MainWindow::~MainWindow() { delete ui; }
但是这种方法有个弊端:在进行初始化复制地址时,如果有很多控件,势必一行语句一个复制,工作量大而且很不优雅。
方法2:采用 findChild()
采用 findchild 的方法
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QLineEdit> #include <QMainWindow> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; QLineEdit *LineEdit; }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // for(quint32 i=0;i!=3;++i){ LineEdit = findChild<QLineEdit *>("lineEdit_"+QString::number(i+1)); LineEdit->setText("this's LineEdit "+QString::number(i+1)); } } MainWindow::~MainWindow() { delete ui; }
来看看findChild的声明,位于 QObject Class 文档内
T QObject::findChild(const QString & name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
对于例子
qDebug()<<findChild<QLineEdit *>("lineEdit_0"); qDebug()<<findChild<QLineEdit *>("lineEdit_1");
返回的值为别为
QObject(0x0) QLineEdit(0x36dd28, name = "lineEdit_1")
方法3:采用 findChildren()
当然也可以采用 findChildren的方法来操作
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QList <QLineEdit*> LineEdits = findChildren<QLineEdit *>(); for(QList<QLineEdit*>::size_type i=0;i!=LineEdits.size();++i){ LineEdits.at(i)->setText("this's LineEdit " +QString::number(i+1)); } } MainWindow::~MainWindow() { delete ui; }
findChildre()的声明
QList<T> QObject::findChildren(const QString & name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
对于上述代码,返回所有的QLineEdit对象到QList里面
QList <QLineEdit*> LineEdits = findChildren<QLineEdit *>(); QList <QLineEdit*>::size_type i = LineEdits.size(); qDebug()<< LineEdits; qDebug()<< i;
输出结果为
(QLineEdit(0x1239dd28, name = "lineEdit_1") , QLineEdit(0x692208, name = "lineEdit_2") , QLineEdit(0x692288, name = "lineEdit_3") ) 3
源码下载
扩展阅读
- QT findChild() 及动态初始化窗体布局(原创)
http://zhaiyue-program.iteye.com/blog/1546394 - findChildren()
http://blog.sina.com.cn/s/blog_510737a301012t7w.html - Qt遍历控件
http://windrocblog.sinaapp.com/?p=799 - QList 使用迭代器在循环中删除元素的陷阱
http://shuizhuyuanluo.blog.163.com/blog/static/778181201111189544294/ - Qt 学习之路 2(38):存储容器
http://www.devbean.net/2013/01/qt-study-road-2-containers/
关键字: QList, findChild(), findChildren(), 遍历