在Qt中,有时候会用到功能相近的系列按钮,他们的对象名object name是系列,例如pushbutton1,pushbutton2,pushbutton3……pushbuttonN,对于这样的系列按钮,一般来说,数量比较多,他们处理的功能基本类似,如果用手工一一去建立信号槽,那实实在在是一项体力活,一般的做法是定义一个按钮指针数组,然后手工一一将批量按钮用数组保存其指针,在需要批量处理他们时,遍历数组即可。这是方法之一,但还是不那么优雅,那么是否有更优雅的方式呢?答案是有的。在这里提供两种解决方案。
方案一
不用ui设计师,纯手工创建代码,这个就不用给出具体例子了,相信大家都会。
方案二 利用QObject提供的findChild方法
该方法的原型如下
template <typename T> T QObject::findChild(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
该函数会返回指定T类型,对象名称叫name的对象。如果没有,则返回空。
name:对象名
options:查找选项,默认为Qt::FindChildrenRecursively,即递归查找,
Qt::FindDirectChildrenOnly 该对象的直接孩子,非递归方式
Qt::FindChildrenRecursively 递归查找所有对象
根据我们的需要,参数用非递归查找即可,即Qt::FindDirectChildrenOnly
我们以QPushButton为例,假如我们UI中一共有10个按钮,其对象名依次为pushButton1,pushButton2……pushButton10;
头文件`
#define BUTTONNUM 10
……
namespace Ui {
class MyWidget;
}
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
~MyWidget();
private:
Ui::MyWidget*ui;
QPushButton *m_pButtons[BUTTONNUM];
}
CPP文件
#include "mywidget.h"
#include "ui_mywidget.h"
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
QString strObjName;
for(int i=0;i<BUTTONNUM;i++)
{//批量获取对象并存储到指针数组之中
strObjName=QString("pushButton%1").arg(i);
m_pButtons[i]=findChild<QPushButton *>(strObjName,Qt::FindDirectChildrenOnly);
}
……
}