第55篇 Qt获取Widget窗体子控件-小案例说明

我觉得添加一个按钮要在类里面添加一个变量,这实在是太麻烦了,就想自己在局部函数里面添加,然后通过父窗口名称获取之类的,首先我想到的是打下this->,然后看看后面接什么函数,第一找到的是childAt(),其实这个可以用的,只是在以些其他地方的初始化上有点不友好,没有去研究了,直接网上查找,终于看到了findChild();

1.帮助文档里的函数说明

shuom
在这里插入图片描述英语不好啊,直接百度翻译了。不过主要看的是怎么用对吧,文档里也有说明的,
在这里插入图片描述
我只需要用到第一种就够了。

2.案例

我想写一个点击按钮,然后有提示信息的界面,如下:
在这里插入图片描述

但是我不想直接在窗口类里面添加变量,而是在函数里添加变量,且自己手动编写代码布局,那么怎么实现呢?请看下面。

创建项目不用说了吧。

2.1.打开头文件创建函数

首先项目创建好之后,我们打开窗口类的头文件创建相关的函数,当然要记得添加相应的库头文件。
我们需要添加一个QLabel和一个QPushButton,所以只添加这两个的头文件即可。
然后添加三个函数:init()、myLayout()、btn_ok_clicked()。分别对应按钮的初始化、界面的布局、按钮响应槽函数。
OK,完成了,代码如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QLabel>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    void init();
    void myLayout();
    ~Widget();

public slots:
    void btn_ok_clicked();
};
#endif // WIDGET_H

2.2.对按钮初始化及界面布局

1,初始化的时候记得指定父对象,如this:

QPushButton* btn_ok = new QPushButton("按钮",this);

这样的话,该按钮就是窗体的直接子控件了。

2,给变量指定对象名,即:

btn_ok->setObjectName("btn_ok");

因为findChild()函数查找的时候是通过对象名查找的,不指定对象名的话会找不到。

做完这两步就可以了。

好了,剩下的都在下面了。

#include "widget.h"
#include <QVBoxLayout>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->init();
    this->myLayout();
}

void Widget::init()
{
    QPushButton* btn_ok = new QPushButton("按钮",this);
    btn_ok->setObjectName("btn_ok");
    QObject::connect(btn_ok,SIGNAL(clicked()),this,SLOT(btn_ok_clicked()));

    QLabel* txt_ok = new QLabel("提示",this);
    txt_ok->setObjectName("txt_ok");
    txt_ok->setText("按钮被点击的时候提示!");
}

void Widget::myLayout()
{
    QVBoxLayout* vlayout = new QVBoxLayout();
    vlayout->addWidget(this->findChild<QLabel *>("txt_ok"));
    vlayout->addWidget(this->findChild<QPushButton *>("btn_ok"));
    this->setLayout(vlayout);
}

Widget::~Widget()
{

}

void Widget::btn_ok_clicked()
{
    static int i = 0;//统计点击次数
    QLabel *txt_ok = this->findChild<QLabel *>("txt_ok");
    txt_ok->setText("你点击了耶" + QString::number(i));
    i++;
}

2.3.结果

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在Qt中,可以使用以下方法来获取一个Widget内的所有控件: 1. 使用QObject::findChildren()方法。该方法可以通过指定控件的对象名和类名来获取Widget内的所有控件。以下是一个示例代码: ```cpp QList<QLineEdit*> lineEdits = widget->findChildren<QLineEdit*>(); foreach (QLineEdit* lineEdit, lineEdits) { // 对控件进行操作 } ``` 以上代码中,通过findChildren<QLineEdit*>()方法获取Widget内所有QLineEdit类型的控件,并将它们存储在一个QList中。然后可以使用foreach循环来对每个控件进行操作。 2. 使用QWidget::findChild()方法。该方法可以通过指定控件的对象名和类名来获取Widget内的一个控件。以下是一个示例代码: ```cpp QLineEdit* lineEdit = widget->findChild<QLineEdit*>("lineEditObjectName"); if (lineEdit) { // 对控件进行操作 } ``` 以上代码中,通过findChild<QLineEdit*>()方法获取Widget内名为"lineEditObjectName"的QLineEdit类型控件。然后可以对该控件进行操作。 此外,在Qt的设计模式中,常使用QWidget::children()方法来获取Widget内的所有控件。以下是一个示例代码: ```cpp QList<QLineEdit*> lineEdits; foreach (QObject* child, widget->children()) { QLineEdit* lineEdit = qobject_cast<QLineEdit*>(child); if (lineEdit) { lineEdits.append(lineEdit); } } ``` 以上代码中,通过对QWidget::children()方法返回的QObject对象列表进行类型转换,将所有QLineEdit类型的控件存储在一个QList中。 通过以上方法,你可以方便地获取Widget内的所有控件,并对它们进行操作。 ### 回答2: 在Qt中,可以使用`QObject::findChildren()`方法来获取widget内的所有控件。该方法可以根据指定的对象名称(object name)和对象类型(object type)来查找控件。 使用该方法需要先获得要获取控件widget对象的指针。 然后,可以使用如下代码来获取widget内所有控件的列表: ```cpp // 获取widget对象 QWidget* parentWidget = ... // 定义控件列表 QList<QWidget*> childWidgets; // 使用findChildren()方法获取所有控件 childWidgets = parentWidget->findChildren<QWidget*>(); ``` 上述代码中,`parentWidget`是要获取控件的父级widget对象指针,而`childWidgets`是一个QList容器,用于存储找到的控件对象。 可以根据实际需要,通过设置对象名称或者对象类型来对控件进行过滤。例如,如果需要只获取具有特定对象名称的控件,可以使用如下代码: ```cpp childWidgets = parentWidget->findChildren<QWidget*>("objectName"); ``` 上述代码中,`"objectName"`是指定的对象名称,只有具有该对象名称的控件才会被获取。 总结起来,要获取widget内的所有控件,可以使用`QObject::findChildren()`方法,并根据实际需要设置对象名称或对象类型来过滤控件获取到的控件可以通过遍历容器来对其进行进一步的操作或处理。 ### 回答3: 在Qt中,可以通过widget的childItems()函数来获取widget内的所有窗体控件。childItems()函数返回的是一个QList<QGraphicsItem*>类型的列表,其中存储了widget内的所有控件。可以遍历这个列表来获取每个控件的相关信息。 使用childItems()函数需要包含<QtWidgets/QGraphicsItem>头文件。下面是一个示例代码: ```cpp #include <QtWidgets/QGraphicsItem> // 获取widget窗体所有控件的函数 void getAllChildWidgets(QWidget* widget) { QList<QGraphicsItem*> childItems = widget->childItems(); for (QGraphicsItem* item : childItems) { // 可以通过item来进行控件的操作,比如获取控件的类型、属性等 // 下面展示获取控件的类型 QString typeName = item->typeName(); qDebug() << "控件类型:" << typeName; } } // 调用示例 QWidget* mainWidget = new QWidget; // ...添加控件... getAllChildWidgets(mainWidget); ``` 这样就可以通过遍历childItems()返回的列表,获取widget内的所有窗体控件,可以根据需要进行相关操作,比如获取控件的类型、属性等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大唐不良猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值