Qt 批量操作 UI 控件

目录 Content
[hide]

目的

Qt的UI界面编程时,会遇到这种情况,界面上分布大量相同的控件,如LineEdit_1、LineEdit_2、LineEdit_3 等一系列控件。对这么多控件进行操作,无疑采用遍历的方式是最好的办法,可是往往这些控件都是在UI设计器里手动添加的,所以并不能立刻得到可批量操作的地址。下面有3种方法可以供操作。

qt_objects_batch

方法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

源码下载

batch_objects.zip

扩展阅读

关键字: QList, findChild(), findChildren(), 遍历

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.