第55篇 Qt获取Widget窗体子控件-小案例说明
我觉得添加一个按钮要在类里面添加一个变量,这实在是太麻烦了,就想自己在局部函数里面添加,然后通过父窗口名称获取之类的,首先我想到的是打下this->,然后看看后面接什么函数,第一找到的是childAt(),其实这个可以用的,只是在以些其他地方的初始化上有点不友好,没有去研究了,直接网上查找,终于看到了findChild();
1.帮助文档里的函数说明
英语不好啊,直接百度翻译了。不过主要看的是怎么用对吧,文档里也有说明的,
我只需要用到第一种就够了。
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++;
}