本文继续:
YYLi-CV:Qt入门系列(二)zhuanlan.zhihu.com7.自定义控件封装
增加新的sw.ui界面
选装父文件—>添加文件-->Qt--->设计师界面->命名smallWidget(简称sw)
选择sw.ui->选择Spin Box和Horizontal Slider进行水平布局->但此时运行还是原来的w.ui--》想把sw.ui用在原来w.ui上
查看sw.ui的类型widget-》在w.ui上添加Widget控件-》右键选提升为->把类名复制进去-》点击添加-》点击提升--》运行出现!
现在要实现两者同时移动
自己输入空间查找想要的信号和槽函数Public Slots,如子类中没有,查找父类的槽函数
在sw.cpp中添加代码:
//QSpingBox移动,QSlider跟着移动
//因为重载,需要写个函数指针
void(QSpinBox:: *spSignal)(int)=&QSpinBox::valueChanged;
connect(ui->spinBox,spSignal,ui->horizontalSlider,&QSlider::setValue);
//反过来
connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue);
结果显示:
![c2c01f9c544a9079fdcb6c2bbda37ce3.png](https://i-blog.csdnimg.cn/blog_migrate/e67f01bb3e7e9153ea940d4ade624b6c.png)
需求:设置数字和获取数字
在w.ui上添加两个按钮push Botton
在sw.h和sw.cpp中设置接口和实现
//设置数组
void SmallWidget::setNum(int num){
ui->spinBox->setValue(num);
}
//获取数字
int SmallWidget::getNum(){
return ui->spinBox->value();
}
在w.cpp中进行关联
//获取到控件当前的值
connect(ui->get,&QPushButton::clicked,[=](){
qDebug() << ui->widget->getNum();
});
//设置数字
connect(ui->set,&QPushButton::clicked,[=](){
ui->widget->setNum(50);
});
结果显示:
![f0df9a78dbab290124262fc9c863e90c.png](https://i-blog.csdnimg.cn/blog_migrate/fa280cd6bb78541e31ac9aca3b955dd5.png)
8.事件
8.1.鼠标事件
->ui.上选择一个Label控件
-》父节点新添加一个class Label(简称l)
在l.h和l.cpp中添加实现:
//鼠标进入事件
void Label::enterEvent(QEvent *event)
{
qDebug()<<"鼠标进入了";
}
//鼠标离开
void Label::leaveEvent(QEvent *)
{
qDebug()<<"鼠标离开了";
}
注意,此时控件与鼠标没有关联,进行关联
把新建的class l改成继承于QLabel。
在Label控件上右键提升为--》Label,生成即可
结果显示:
![7cf383d9cbc6fd508b20205ced38a4a2.png](https://i-blog.csdnimg.cn/blog_migrate/f6637db1fccc906c3c0fc56f394d66c0.png)
此时需要重写鼠标按下,离开等,在l.cpp中继续添加:
//鼠标按下
void Label::mousePressEvent(QMouseEvent *ev)
{
//当鼠标左键按下
if(ev->button()==Qt::LeftButton)
{
QString str=QString("鼠标按下,x=%1,y=%2,globalX=%3,globalY=%4").arg(ev->x()).arg(ev->y()).
arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
}
}
//鼠标释放
void Label::mouseReleaseEvent(QMouseEvent *ev)
{
qDebug()<<"鼠标释放";
}
//鼠标移动
void Label::mouseMoveEvent(QMouseEvent *ev)
{
//当鼠标左键按下,区别于按下
if(ev->buttons() & Qt::LeftButton)
{
QString str=QString("鼠标按下,x=%1,y=%2,globalX=%3,globalY=%4").arg(ev->x()).arg(ev->y()).
arg(ev->globalX()).arg(ev->globalY());