Qt批量创建控件与批量操作控件QPushButton QLineEdit

使用QT编程,

题目1:

假设有这样的需求:向Widget窗体中添加30个按钮(QPushButton),如何用代码实现呢?

有两种方法,一种是:

添加:

for (i = 0; i<30; i++)
{
	QPushButton *bt = new QPushButton(QString::asprintf("Button%d", i + 1), ui->widget);//注:最后一个参数一定为一个“父窗体”!
	bt->setGeometry(i * 10, i * 10, 50, 50); //x、y是相对于“父窗体”的位置,可以自己验证
}

使用:
//获得控件的个数
ui->widget->children().count();
//访问每一个按钮
for (i = 0; i<30; i++)
{
	QPushButton *bt = (QPushButton *)(ui->widget->children().at(i));
	qDebug() << bt->text();//使用
}

另一种是借用QLayout的addWidget的方法添加,如下:
QGridLayout *layout = new QGridLayout();
int i = 0, j = 0;
int k = 0;
for (i = 0; i<6; i++)
{
	for (j = 0; j<2; j++)
	{
		if (j == 0) k = i;
		if (j == 1) k = 6 + i;
		//cb是已经声明好了的QCheckBox类型变量。
		cb[k] = new QCheckBox(QString::asprintf("%d", k + 1));
		layout->addWidget(cb[k], i, j);
	}
}

layout->setHorizontalSpacing(10);
layout->setVerticalSpacing(10);
layout->setContentsMargins(10, 10, 10, 10);
ui->groupBox->setLayout(layout);//ui->groupBox又是另外一个窗体

需要访问时,直接使用cb[0]、cb[1]....

题目2

这篇文章标题比较特殊,呵呵,昨天在读别人源代码得时候发现了一个函数 :findChildren(),当时就吸引我了,这是什么意思,翻了下文当终于明白是干什么用得了。在实际得Qt编程过程中,通常会有多个空间嵌套,就比如说:主窗体是QMainWdow,中央挂件是QTabWidget,而每一个QTabWidget子窗口中又有QTextEdit,这样得组合就是经典得多标签页文本编辑器样式,当然这个暑假我也在做这种编辑器。通常我们可以很容易得获得QMainWindow上QTabWidget控件得对象,但是想要直接操作QTabWidget中嵌套得QTextEdit就不能直接引用,现在我们有了这个函数就可以轻松搞定了,函数原型如下:

QList<T> QObject::findChildren(const QString &name=QString()) const

当然关于“找孩子”得函数不只这一个,具体得大家可以再查文档,这里给出一个例子:

QList<QLineEdit *> lineEdit = tabWidget.findChildren<QLineEdit *>();

这句话的意思就是在tabWidget挂件种寻找所有得QLineEdit控件,然后返回给QList容器(QList容器中每一个元素都为 QLineEdit *类型),下面给出一个实例:
描述:主窗体为QMainWindow,中央挂件为QTabWidget,每个子页面包括若干个QLineEdit(注意:Tab1页面有两个,Tab2页面有1个),当单击“setText”按钮时候,自动给每一个QLineEdit填充文字。

关键代码如下:


void MainWindow::on_pushButton_clicked()
{
    QList<QLineEdit *> lineEdit=ui->tabWidget->findChildren<QLineEdit *>();
    for (int i=0;i<lineEdit.count();i++)
    lineEdit.at(i)->setText("www.hicjiajia.cn");
}
这样对我们操作多嵌套式得控件确实很方便,但是又有一个问题了,这种方法会将所有QLineEdit都给影响到了,但是我现在想只让某个特定得QLineEdit来响应怎摸办,还好,findChildren()函数还是可以带参数得:
QList<QLineEdit *> lineEdit = tabWidget.findChildren<QLineEdit *>("lineEdit");
注意:括号里得 lineEdit 参数为控件得 objectName ,因此这里我们可以指定任何控件,很方便….改成上述代码效果如图:
注意: findChild()与findChildren()不支持MSVC6,因此Qt专门提供了另外两个兼容VC6得“找孩子函数”分别为:qFindChild()与qFindChildren()

 

转载:

https://blog.csdn.net/caoshangpa/article/details/53633889

https://blog.csdn.net/dijkstar/article/details/81868292

©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页