前面几篇我们介绍了Qt自带的控件,本篇将会介绍如何自定义组合控件并创建接口为其他控件所使用的。
在进行实际开发中,Qt自带的控件无法满足开发需求时,就需要通过对Qt控件进行封装实现自定义控件。
1. 首先创建名为“01_SmallWidget”的widget程序
最终生成的文件结构如下,既增加了.ui文件,又增加了对应的.cpp和.h文件
整体水平布局后调整整体大小,后期使用时控件大小即为这么大小
(1)查看smallwidget.ui的类型为widget
在widget.ui中放一个widget的容器用于显示smallwidget内容
(2)为了保证“提升”中填写的类名正确,可以在对应的.h文件中进行复制
(3)勾选“全局包含”
(4)点击“添加”之后,smallWidget显示还未被使用,且widget的类仍为QWidget
(5)点击“提升”,widget控件变为smallWidget
运行后得到的如下:组合控件被载入
(6)上面提到的勾选“全局包含”是为了在后期再需要提升为smallWidget,不需要上面过程,工具自动帮助添加“提升为”选项
(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 #includenamespace 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" #includeWidget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); //点击获取,获取控件当前值 connect(ui->btn_get,&QPushButton::clicked,[=](){ qDebug()< widget->getNum(); }); //点击设置,设置控件当前值 connect(ui->btn_set,&QPushButton::clicked,[=](){ ui->widget->setNum(50); }); } Widget::~Widget() { delete ui; }
7. 学习视频地址:QT从入门到实战x篇_21_自定义控件封装



