前面几篇我们介绍了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
类中进行关联
由于
QSpinBox
的
signal
函数
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_自定义控件封装