一、实现思路
再很多应用我们都会用到折叠式按钮功能。讲一下简单思路,利用QpropertyAnimation实现动画播放,然后计算好动画的起始和结束位置,将整体布局尽心偏移,我们就能达到折叠式按钮的功能。
二、代码
本示例因项目原因我用的label实现,换成button即可。
头文件部分:
public:
bool eventFilter(QObject *obj, QEvent *event); // 添加时间过滤器声明 label无点击事件 故需要用事件过滤的方式
private:
QPropertyAnimation *propertyAnimation;//布局部分动画
QPropertyAnimation *propertyAnimationlabel;//label部分动画
bool isside_Flage = false;//折叠状态标志位
cpp部分
绑定部分
ui.label_8->installEventFilter(this);//label安装事件过滤器
//动画分别绑定对应的布局或控件
propertyAnimation = new QPropertyAnimation(ui.tabWidget, "geometry");
propertyAnimation->setEasingCurve(QEasingCurve::InOutQuint);
propertyAnimation->setDuration(300);
propertyAnimationlabel = new QPropertyAnimation(ui.label_8, "geometry");
propertyAnimationlabel->setEasingCurve(QEasingCurve::InOutQuint);
propertyAnimationlabel->setDuration(300);
实现部分
bool videoshowi::eventFilter(QObject * obj, QEvent * event)
{
Q_UNUSED(event)
if (obj == ui.label_8)//指定某个QLabel
{
if (event->type() == QEvent::MouseButtonPress) //鼠标点击
{
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); // 事件转换
if (mouseEvent->button() == Qt::LeftButton)
{
if (!isside_Flage)//折叠
{
propertyAnimation->setStartValue(QRect(this->rect().width(), ui.tabWidget->geometry().topLeft().y(), ui.tabWidget->width(), ui.tabWidget->height()));
propertyAnimation->setEndValue(QRect(this->rect().width(), ui.tabWidget->geometry().topLeft().y(), ui.tabWidget->width(), ui.tabWidget->height()));
propertyAnimation->start();
propertyAnimationlabel->setStartValue(QRect(this->rect().width() - ui.label_8->width(), ui.label_8->geometry().topLeft().y(), ui.label_8->width(), ui.label_8->height()));
propertyAnimationlabel->setEndValue(QRect(this->rect().width() - ui.label_8->width(), ui.label_8->geometry().topLeft().y(), ui.label_8->width(), ui.label_8->height()));
propertyAnimationlabel->start();
isside_Flage = !isside_Flage;
return true;
}
else//回复
{
propertyAnimation->setStartValue(QRect(this->rect().width()- (ui.tabWidget->geometry().topRight().x()- ui.tabWidget->geometry().topLeft().x()), ui.tabWidget->geometry().topLeft().y(), ui.tabWidget->width(), ui.tabWidget->height()));
propertyAnimation->setEndValue(QRect(this->rect().width() - (ui.tabWidget->geometry().topRight().x() - ui.tabWidget->geometry().topLeft().x()), ui.tabWidget->geometry().topLeft().y(), ui.tabWidget->width(), ui.tabWidget->height()));
propertyAnimation->start();
propertyAnimationlabel->setStartValue(QRect(this->rect().width() - ui.label_8->width()- (ui.tabWidget->geometry().topRight().x() - ui.tabWidget->geometry().topLeft().x()), ui.label_8->geometry().topLeft().y(), ui.label_8->width(), ui.label_8->height()));
propertyAnimationlabel->setEndValue(QRect(this->rect().width() - ui.label_8->width()- (ui.tabWidget->geometry().topRight().x() - ui.tabWidget->geometry().topLeft().x()), ui.label_8->geometry().topLeft().y(), ui.label_8->width(), ui.label_8->height()));
propertyAnimationlabel->start();
isside_Flage = !isside_Flage;
return true;
}
}
else
{
return false;
}
}
else
{
return false;
}
}
else
{
// pass the event on to the parent class
return QWidget::eventFilter(obj, event);
}
}
三、演示效果
效果中标签我是用的竖线图片,可以自己搜索一些美观的折叠式按钮图片放上去文章来源地址https://www.toymoban.com/news/detail-602580.html
文章来源:https://www.toymoban.com/news/detail-602580.html
到了这里,关于QT中实现折叠式按钮的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!