目标功能:
(1)按下btn,弹出绿色页面。
(2)按下btn2,绿色页面隐藏。
(3)按下左边余下的区域,绿色页面也隐藏。
(4)平滑地显示和隐藏
效果:
form.h
cpp
#ifndef FORM_H
#define FORM_H
#include <QWidget>
namespace Ui {
class Form;
}
class Form : public QWidget
{
Q_OBJECT
public:
explicit Form(QWidget *parent = nullptr);
~Form();
private slots:
void on_pushButton_clicked();
private:
Ui::Form *ui;
signals:
void begin_move();
};
#endif // FORM_H
form.cpp
cpp
#include "form.h"
#include "ui_form.h"
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
}
Form::~Form()
{
delete ui;
}
void Form::on_pushButton_clicked()
{
emit begin_move();
}
widget.h
cpp
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "form.h"
#include <QPropertyAnimation>
#include <QMouseEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected:
void mousePressEvent(QMouseEvent *event) override;
bool eventFilter(QObject *obj,QEvent *event) override;
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
Form *f;
QPropertyAnimation *animation,*animation1;
bool flag;
bool isShow;
};
#endif // WIDGET_H
widget.cpp
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QEvent>
#pragma execution_character_set("utf-8")
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
f=new Form(this);
f->hide();
flag=1;
isShow=0;
ui->pushButton_2->installEventFilter(this);
connect(f,&Form::begin_move,this,[=](){
if(isShow == 1){
animation1->start();
isShow=0;
}
});
}
Widget::~Widget()
{
delete ui;
}
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton){
qDebug()<<"按下了鼠标左键";
qDebug()<<event->pos();
if(isShow == 1){
animation1->start();
isShow=0;
}
}
}
bool Widget::eventFilter(QObject *obj, QEvent *event)
{
if(obj==ui->pushButton_2){
if(event->type() == QEvent::MouseButtonPress){
qDebug()<<"按下按钮";
QMouseEvent * me =static_cast<QMouseEvent *>(event);
if(me->button() & Qt::LeftButton){
qDebug()<<"按下左键";
if(isShow == 1){
animation1->start();
isShow=0;
}
}
return false;
}
}
return QWidget::eventFilter(obj,event);
}
void Widget::on_pushButton_clicked()
{
if(flag==1){
flag=0;
f->resize(300,height());
f->move(width(),0);
f->show();
animation = new QPropertyAnimation(f,"pos");
animation->setDuration(1000); //设置动画完成的时间长度
animation->setStartValue(QPoint(width(),0)); //设置动画的开始值
animation->setEndValue(QPoint(width()-f->width(),0)); //设置动画的结束值
animation1 = new QPropertyAnimation(f,"pos");
animation1->setDuration(1000); //设置动画完成的时间长度
animation1->setStartValue(QPoint(width()-f->width(),0)); //设置动画的开始值
animation1->setEndValue(QPoint(width(),0)); //设置动画的结束值
}
animation->start(); //启动动画
isShow=1;
}