基于qt制作可下拉-收缩的窗口

思路:来自一个qt交流群的讨论。在下拉窗口上面的抬头栏右边加上一个图标,每次点击到这个图标,就触发展开\收缩窗口。

源代码:

#include "ExpandableLbl.h"
#include <QPixmap>
#include <QHBoxLayout>
#include <QEvent>

ExpandableLbl::ExpandableLbl(QString qstrTitle, QString qstrPix, std::function<void (void)> const & pFunc, QWidget *parent) : QWidget(parent)
{
    setWindowFlags(Qt::FramelessWindowHint);
    QHBoxLayout * pHBLayout = new QHBoxLayout;
    pHBLayout->addWidget(new QLabel(qstrTitle));
    m_pLbl = new QLabel;
    QPixmap pix(qstrPix);
    pix = pix.scaled(15,15);
    m_pLbl->setPixmap(pix);
    pHBLayout->addStretch();
    pHBLayout->addWidget(m_pLbl);

    setFixedHeight(50);
    setLayout(pHBLayout);

    m_pLbl->installEventFilter(this);
    m_pFoldFunc = pFunc;
}

bool ExpandableLbl::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == m_pLbl)
    {
        if(event->type() == QEvent::MouseButtonRelease)
        {
            //展开或者收起
            m_pFoldFunc();
            return true;//不再向上传播
        }
    }

    return QWidget::eventFilter(watched, event);
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QScrollArea>
#include <QVBoxLayout>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QScrollArea * pScrollArea = new QScrollArea;
    QWidget * pWgt = new QWidget;
    pWgt->setStyleSheet("background-color:red;");
    QVBoxLayout * pVLayout = new QVBoxLayout;
    QWidget * pWgtFoldable = new QWidget;
    pWgtFoldable->setFixedHeight(500);
    pWgtFoldable->setStyleSheet("background-color:green;");
    QPushButton * pBtn = new QPushButton("qwertyui");
    ExpandableLbl * plbl = new ExpandableLbl(QString::fromWCharArray(L"可伸缩"), QString("arrow2.png"), [pWgtFoldable](){
        pWgtFoldable->setVisible(!pWgtFoldable->isVisible());
    });
    pVLayout->addWidget(plbl);
    pVLayout->addWidget(pBtn);
    pVLayout->addWidget(pWgtFoldable);
    pVLayout->addWidget(new QPushButton(QString("12345678")));
    pVLayout->addStretch();
    pWgt->setLayout(pVLayout);
    pScrollArea->setWidget(pWgt);
    pScrollArea->setWidgetResizable(true);

    QPushButton * pWgtBottom = new QPushButton("bottom");
    ui->verticalLayout->addWidget(pScrollArea);
    ui->verticalLayout->addWidget(pWgtBottom);

    setFixedHeight(800);
}

MainWindow::~MainWindow()
{
    delete ui;
}

 效果:

展开:

收缩:

 

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在Qt中,可以使用动画效果实现窗口的动态展开和收缩。首先,我们可以使用QPropertyAnimation类来创建一个动画对象,并指定相应的目标属性,如窗口的宽度、高度等。然后,通过设置动画的持续时间、起始值和结束值,可以实现窗口的平滑动画效果。 对于窗口的展开效果,可以通过逐渐增加窗口的宽度和高度来实现。可以设置动画的起始值为初始窗口大小,结束值为展开后的窗口大小,再设置动画的持续时间,调用start()方法开始动画。 对于窗口收缩效果,可以通过逐渐减小窗口的宽度和高度来实现。可以设置动画的起始值为展开后的窗口大小,结束值为收缩后的窗口大小,再设置动画的持续时间,调用start()方法开始动画。 为了让窗口在动画期间保持响应和更新,可以使用QCoreApplication::processEvents()函数。在动画结束后,可以重新调整窗口的布局和内容,以适应展开或收缩后的窗口大小。 通过使用动画效果,窗口的展开和收缩过程将更加平滑和美观,提升用户体验。在Qt中,提供了丰富的动画和过渡效果类,可以更加灵活地实现各种窗口动态展开和收缩的效果。 ### 回答2: 在Qt中,可以通过使用QPropertyAnimation类来实现窗口的动态展开和收缩。 首先,我们需要创建一个QWidget窗口,并设置它的初始大小为收缩状态。然后,在展开或收缩窗口的按钮点击事件中,我们可以使用QPropertyAnimation来实现动画效果。 例如,在展开窗口的按钮点击事件中,我们可以按照以下步骤来实现动态展开效果: 1. 创建一个QPropertyAnimation对象,指定目标对象为QWidget窗口。 2. 使用setPropertyName函数设置动画的属性为窗口的大小。 3. 使用setDuration函数设置动画的持续时间,单位为毫秒。 4. 使用setStartValue和setEndValue函数设置大小属性的起始值和结束值,使窗口从初始大小逐渐展开到最终大小。 5. 调用start函数开始执行动画。 在收缩窗口的按钮点击事件中,我们可以按照类似的步骤来实现动态收缩效果,只需要将起始值和结束值的设置反过来即可。 当按钮被点击时,会执行对应的展开或收缩动画,从而实现窗口的动态展开和收缩效果。 除了使用QPropertyAnimation,还可以使用QWidget的resize函数来实现窗口的动态展开和收缩。具体方法是在按钮点击事件中根据需要调用resize函数设置窗口的大小。 通过以上方法,我们可以轻松地实现Qt窗口的动态展开和收缩,为用户提供更好的交互体验。 ### 回答3: 在Qt中,可以使用QPropertyAnimation来实现窗口的动态展开和收缩效果。 首先,我们可以使用QBoxLayout来管理窗口的布局。我们可以将需要展开和收缩的部分放在一个QVBoxLayout中,然后将该布局设置给窗口的主布局。 接下来,我们可以创建一个QPropertyAnimation对象,用来控制展开和收缩的动画效果。我们需要设置动画的目标对象和目标属性。目标对象是需要展开和收缩的QWidget,而目标属性可以是其高度或者大小。 当需要展开窗口时,我们可以通过设置动画的起始值为0,目标值为目标对象的最小尺寸/高度,然后启动动画。在动画更新过程中,我们可以根据动画的当前值来改变目标对象的尺寸/高度,实现窗口的动态展开效果。 当需要收缩窗口时,我们可以将动画的起始值设置为目标对象的当前尺寸/高度,目标值设置为0,然后启动动画。在动画更新过程中,我们同样根据动画的当前值来改变目标对象的尺寸/高度,实现窗口的动态收缩效果。 为了方便使用,我们可以将展开和收缩窗口的操作封装成两个函数,并在需要展开或收缩的时候调用它们。 总的来说,通过使用QPropertyAnimation,我们可以实现Qt窗口的动态展开和收缩效果,从而提升用户体验和界面交互的友好性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值