Qt 批量操作 UI 控件
目的
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; }
对于例子
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; }
对于上述代码,返回所有的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