QT从入门到实战x篇_21_自定义控件封装(手动新增一个.ui文件;封装自定义组合控件;调用自定义控件;创建自定义控件间的功能关联;外部控件与自定义控件交流,创建自定义控件接口函数)

前面几篇我们介绍了Qt自带的控件,本篇将会介绍如何自定义组合控件并创建接口为其他控件所使用的

在进行实际开发中,Qt自带的控件无法满足开发需求时,就需要通过对Qt控件进行封装实现自定义控件。

1. 首先创建名为“01_SmallWidget”的widget程序

在这里插入图片描述

2. 手动新增一个.ui文件

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
最终生成的文件结构如下,既增加了.ui文件,又增加了对应的.cpp.h文件
在这里插入图片描述

3. 在smallwidget.ui中封装spinbox和Horizontal Slider的组合控件


整体水平布局后调整整体大小,后期使用时控件大小即为这么大小

在这里插入图片描述

4. 在widget.ui中调用smallwidget中封装的自定义的组合控件

(1)查看smallwidget.ui的类型为widget
在这里插入图片描述
在widget.ui中放一个widget的容器用于显示smallwidget内容
在这里插入图片描述
(2)为了保证“提升”中填写的类名正确,可以在对应的.h文件中进行复制
在这里插入图片描述
(3)勾选“全局包含”
在这里插入图片描述
(4)点击“添加”之后,smallWidget显示还未被使用,且widget的类仍为QWidget
在这里插入图片描述
(5)点击“提升”widget控件变为smallWidget
在这里插入图片描述
运行后得到的如下:组合控件被载入
在这里插入图片描述
(6)上面提到的勾选“全局包含”是为了在后期再需要提升为smallWidget,不需要上面过程,工具自动帮助添加“提升为”选项
在这里插入图片描述
在这里插入图片描述

5. spinbox和Horizontal Slider的2个控件进行关联


(1)在smallWidget类中进行关联
由于 QSpinBoxsignal函数 valueChanged 存在两个函数重载,需要函数指针指明具体指向哪个信号

在这里插入图片描述

    //SpinBox移动,Qslider跟着移动
    void (QSpinBox::*spSignal)(int)=&QSpinBox::valueChanged;
    connect(ui->spinBox,spSignal,ui->horizontalSlider,&QSlider::setValue);

运行结果:QSpinBox控件数字变化,对应的QSlider控件也发生改变
在这里插入图片描述
(2)实现Qslider滑动,SpinBox数据跟着改变

    //Qslider滑动,SpinBox数据跟着改变
    connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue);

6. 在外部控件中使用自定义控件


(1)在smallWidget中增加外部控制接口
有如下需要,当界面中的两个按钮点击后,分别实现 “获取当前值”“设置到一半”功能

在这里插入图片描述
(2)创建接口函数

  • smallWidget.h
#ifndef SMALLWIDGET_H
#define SMALLWIDGET_H

#include <QWidget>

namespace Ui {
class smallWidget;
}

class smallWidget : public QWidget
{
    Q_OBJECT

public:
    explicit smallWidget(QWidget *parent = 0);
    ~smallWidget();

    //设置数字
    void setNum(int num);
    //获取数字
    int getNum();

private:
    Ui::smallWidget *ui;
};

#endif // SMALLWIDGET_H
  • smallWidget.cpp
#include "smallwidget.h"
#include "ui_smallwidget.h"

smallWidget::smallWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::smallWidget)
{
    ui->setupUi(this);

    //SpinBox移动,Qslider跟着移动
    void (QSpinBox::*spSignal)(int)=&QSpinBox::valueChanged;
    connect(ui->spinBox,spSignal,ui->horizontalSlider,&QSlider::setValue);

    //Qslider滑动,SpinBox数据跟着改变
    connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue);
}

smallWidget::~smallWidget()
{
    delete ui;
}

void smallWidget::setNum(int num)
{
    ui->spinBox->setValue(num);
}

int smallWidget::getNum()
{
    return ui->spinBox->value();
}

(3)关联到自己的Widget.cpp文档中

  • 点击获取,获取控件当前值

在这里插入图片描述

  • 点击设置,设置控件当前值
    //点击设置,设置控件当前值
    connect(ui->btn_set,&QPushButton::clicked,[=](){
    ui->widget->setNum(50);
    });

在这里插入图片描述

  • widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QtDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //点击获取,获取控件当前值
    connect(ui->btn_get,&QPushButton::clicked,[=](){
       qDebug()<<ui->widget->getNum();
    });

    //点击设置,设置控件当前值
    connect(ui->btn_set,&QPushButton::clicked,[=](){
    ui->widget->setNum(50);
    });
}

Widget::~Widget()
{
    delete ui;
}

7. 学习视频地址:QT从入门到实战x篇_21_自定义控件封装

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十月旧城

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

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

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

打赏作者

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

抵扣说明:

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

余额充值