Qt 批量操作 UI 控件

目的

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;
}

对于例子

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

 

posted @ 2017-05-12 09:27  etcjd  阅读(4521)  评论(0编辑  收藏  举报