首页 > 其他分享 >qt 折叠与展开 窗口,折叠列表,展开列表,抽屉效果,根据窗口大小自动产生滚动条

qt 折叠与展开 窗口,折叠列表,展开列表,抽屉效果,根据窗口大小自动产生滚动条

时间:2023-12-16 20:02:33浏览次数:26  
标签:std unique 窗口 get 折叠 列表 new include ptr

 

 

自定义折叠控件,h头文件

#ifndef QUESTIONBANKWIDGET_H
#define QUESTIONBANKWIDGET_H

#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QToolButton>
#include <QPushButton>
#include <QLabel>
#include <QListWidget>
#include <memory>

class QuestionBankWidget : public QWidget
{
    Q_OBJECT
public:
    explicit QuestionBankWidget(QWidget *parent = nullptr);

    /*
     * @brief 主布局
     * @prama
     * @return
     */
    void mainLayout();
    /*
     * @brief 展开与折叠
     * @prama
     * @return
     */
    void fold_unfold();

signals:

private:
    std::unique_ptr<QVBoxLayout> m_mainLayout;

    std::unique_ptr<QWidget> m_titleWid;
    std::unique_ptr<QHBoxLayout> m_titlehly;
    std::unique_ptr<QPushButton> m_titleNameBt;
    std::unique_ptr<QToolButton> m_foldBt;

    std::unique_ptr<QWidget> m_questionWidget;
    std::unique_ptr<QVBoxLayout> m_listvlay;

    std::unique_ptr<QHBoxLayout> add_del_bt_hlay;
    std::unique_ptr<QToolButton> m_addquestion;
    std::unique_ptr<QToolButton> m_delquestion;

    std::unique_ptr<QListWidget> m_listwidget;
    bool m_fold1{false};
};

#endif // QUESTIONBANKWIDGET_H

自定义折叠控件,cpp文件

#include "questionbankwidget.h"
#include <QPropertyAnimation>

QuestionBankWidget::QuestionBankWidget(QWidget *parent)
    : QWidget{parent}
    , m_mainLayout( new QVBoxLayout(this))
    , m_titleWid(new QWidget(this))
    , m_titlehly(new QHBoxLayout(this))
    , m_titleNameBt(new QPushButton(this))
    , m_foldBt(new QToolButton(this))
    , m_questionWidget(new QWidget(this))
    , m_listvlay(new QVBoxLayout(this))
    , add_del_bt_hlay(new QHBoxLayout(this))
    , m_addquestion(new QToolButton())
    , m_delquestion(new QToolButton())
    , m_listwidget(new QListWidget(this))
{

    this->setAttribute(Qt::WA_StyledBackground);
    this->setObjectName("QuestionBankWidget");
    m_titleNameBt->setObjectName("m_titleNameBt");
    m_titleWid->setObjectName("m_titleWid");
    m_titleWid->setFixedHeight(35);
    m_titleNameBt->setText("学生管理"); 
    m_foldBt->setObjectName("m_foldBt");
    QPixmap pixmap(":/resource/arrow_pressed_top.png");
    m_foldBt->setIcon(QIcon(pixmap));
    connect(m_foldBt.get(),&QToolButton::clicked,this,[&](){
        fold_unfold();
    });
    connect(m_titleNameBt.get(),&QPushButton::clicked,this,[&](){
        fold_unfold();
    });

    // 初始界面时显示的固定高度
    this->setFixedHeight(35);
    // 题库列表固定高度
    m_questionWidget->setFixedHeight(0);
    m_addquestion->setText("添加");
    m_delquestion->setText("删除");
    m_listwidget->addItem("学生1"); //
    m_listwidget->addItem("学生2");
    m_listwidget->addItem("学生3");
    m_listwidget->addItem("学生4");
    m_listwidget->addItem("学生5");
    m_listwidget->addItem("学生6");
    m_listwidget->addItem("学生7");
    m_listwidget->addItem("学生8");
    m_listwidget->addItem("学生9");

    mainLayout();
}


void QuestionBankWidget::mainLayout()
{
    // 折叠标题布局 :添加标题名标签和折叠按钮到布局中
    m_titlehly->addWidget(m_titleNameBt.get());
    m_titlehly->addWidget(m_foldBt.get());
    m_titlehly->setContentsMargins(0,0,0,0);
    // 将标题布局添加到标题widget中
    m_titleWid->setLayout(m_titlehly.get());

    // 将添加题库的按钮和删除题库的按钮添加到add_del_bt_hlay布局中
    add_del_bt_hlay->addStretch();
    add_del_bt_hlay->addWidget(m_addquestion.get());
    add_del_bt_hlay->addWidget(m_delquestion.get());
    add_del_bt_hlay->setContentsMargins(0,0,0,0);

    // 添加到布局中
    m_listvlay->addLayout(add_del_bt_hlay.get());
    m_listvlay->addWidget(m_listwidget.get());
    m_listvlay->setContentsMargins(0,0,0,0);
    m_questionWidget->setLayout(m_listvlay.get());

    // 添加到主布局中
    m_mainLayout->addWidget(m_titleWid.get());
    m_mainLayout->addWidget(m_questionWidget.get());
    m_mainLayout->addStretch();
    m_mainLayout->setContentsMargins(0,0,0,0);
    this->setLayout(m_mainLayout.get());
}

void QuestionBankWidget::fold_unfold()
{
    if(m_fold1 == false){
        QPixmap pixmap(":/resource/arrow_pressed_down.png");
        m_foldBt->setIcon(QIcon(pixmap));
        QPropertyAnimation* animation = new QPropertyAnimation(this, ""); //qt动画类
        animation->setDuration(15); //动画持续时间15ms ,15毫秒折叠和展示时不卡顿
        animation->setStartValue(0);//动画开始值和结束值
        animation->setEndValue(400);
        connect(animation, &QPropertyAnimation::valueChanged, [this](const QVariant& value){
            m_questionWidget->setFixedHeight(value.toInt());
            this->setFixedHeight(35+value.toInt());
        });
        animation->start(QAbstractAnimation::DeleteWhenStopped);
        m_fold1 = true;
    }
    else
    {
        QPixmap pixmap(":/resource/arrow_pressed_top.png");
        m_foldBt->setIcon(QIcon(pixmap));
        QPropertyAnimation* animation = new QPropertyAnimation(this, ""); //qt动画类
        animation->setDuration(15); //动画持续时间15ms,15毫秒折叠和展示时不卡顿
        animation->setStartValue(400);//动画开始值和结束值
        animation->setEndValue(0);
        connect(animation, &QPropertyAnimation::valueChanged, [this](const QVariant& value){
            m_questionWidget->setFixedHeight(value.toInt());
            this->setFixedHeight(35+value.toInt());
        });
        animation->start(QAbstractAnimation::DeleteWhenStopped);
        m_fold1 = false;
    }
}

加入到自动产生滚动条的控件中

自动产生滚动条的控件,h头文件

#ifndef MANAGETESTQUESTIONS_H
#define MANAGETESTQUESTIONS_H

#include <QWidget>
#include <QVBoxLayout>
#include <QListWidget>
#include <QListWidgetItem>
#include <QScrollArea>
#include <memory>
#include "questionbankwidget.h"

class ManageTestQuestions : public QWidget
{
    Q_OBJECT
public:
    ManageTestQuestions(QWidget *parent = nullptr);

    void mainlayout();

public:


private:
    std::unique_ptr<QVBoxLayout> m_mainlayout;
    std::unique_ptr<QuestionBankWidget> m_questionbankD; 
    std::unique_ptr<QuestionBankWidget> m_questionbankZ; 
    std::unique_ptr<QuestionBankWidget> m_questionbankF; 
    std::unique_ptr<QuestionBankWidget> m_questionbankJ; 

    std::unique_ptr<QScrollArea> m_scrollarea;
    std::unique_ptr<QWidget> m_scrollCenterWidget;
    std::unique_ptr<QVBoxLayout> vlay;

};

#endif // MANAGETESTQUESTIONS_H

自动产生滚动条的控件,cpp文件

#include "managetestquestions.h"
#include <QPropertyAnimation>

ManageTestQuestions::ManageTestQuestions(QWidget *parent )
    : QWidget(parent)
    , m_mainlayout(new QVBoxLayout)
    , m_questionbankD(new QuestionBankWidget)
    , m_questionbankZ(new QuestionBankWidget)
    , m_questionbankF(new QuestionBankWidget)
    , m_questionbankJ(new QuestionBankWidget)
    , m_scrollarea(new QScrollArea)
    , m_scrollCenterWidget(new QWidget)
    , vlay(new QVBoxLayout)
{
    this->setObjectName("ManageTestQuestions");
    mainlayout();
}

void ManageTestQuestions::mainlayout(){
    // 将题库窗口添加到布局中
    vlay->addWidget(m_questionbankD.get());
    vlay->addWidget(m_questionbankZ.get());
    vlay->addWidget(m_questionbankF.get());
    vlay->addWidget(m_questionbankJ.get());
    vlay->addStretch();

    // 给scroll中心部件设置上面的布局
    m_scrollCenterWidget->setLayout(vlay.get());

    // 将scroll中心部件添加到scrollarea中
    m_scrollarea->setWidget(m_scrollCenterWidget.get());
    // 设置自动调整大小
    m_scrollarea->setWidgetResizable(true);

    // 将scroll添加到主布局中
    m_mainlayout->addWidget(m_scrollarea.get());
    this->setLayout(m_mainlayout.get());
}

 

标签:std,unique,窗口,get,折叠,列表,new,include,ptr
From: https://www.cnblogs.com/RedWetPlace/p/17906226.html

相关文章

  • 【python基础之列表生成式】---列表生成式
    title:【python基础之列表生成式】---列表生成式date:2023-12-1519:37:06updated:2023-12-1519:37:00description:【python基础之列表生成式】---列表生成式cover:https://zhuanlan.zhihu.com/p/624339792前言由于之前也简述过相关列表生成式的一些内容......
  • 【滑动窗口最值】滑动窗口的最值的一种方案
    假设现在有数组a[n],和滑动的窗口长度为k<=n,要求长度为k的滑动窗口的最值,一般来说,我们会遇到以下问题: 在窗口向右滑动时,由于不知道将要删除的元素在窗口中的位置,于是只能暴力遍历窗口来删除旧元素。增加了时间复杂度到O(n^2logn)以下是解决该问题的一种方案:......
  • 抖音关键词商品列表API:电商行业的成功之道及实时数据获取的魔力
    随着电商行业的快速发展,抖音作为一款短视频社交应用,已经成为电商领域的重要平台。抖音关键词商品列表API接口在电商行业中具有重要意义,它可以帮助商家快速获取商品信息,提高销售效率。本文将探讨抖音关键词商品列表API接口在电商行业中的重要性,以及如何通过实时数据获取提高业务效率......
  • 网上搜集的香港DNS服务器IP地址列表
    1.香港宽频HongKongBroadBandNetworkDNS203.80.96.10203.80.96.9 2.HKNet宽频DNS202.67.240.222202.67.240.221 3.和记环球电话DNS202.45.84.58202.45.84.59 4.网线前线202.81.252.1202.81.252.2 5太平洋超网202.14.67.4202.14.67.14 6.网络快车......
  • 算法Day2双指针法排序,滑动窗口,螺旋矩阵
    Day2双指针法排序,滑动窗口,螺旋矩阵ByHQWQF2023/12/14笔记977.有序数组的平方https://leetcode.cn/problems/squares-of-a-sorted-array/返回一个非递减顺序排序的整数数组每个元素的平方后组成的新数组,新数组也按非递减顺序排序。解法:双指针法由于给定数组本身是有序的,......
  • 【python基础】颜色列表和颜色字典以及python画图
    前言 使用:list_keys=[iforiincnames.keys()]list_values=[iforiincnames.values()] 颜色列表示例:colormap=['#7A57D1','#FF731D','#004d61','#bc8420','#CF0A0A','#83FFE6','#0000A1',&#......
  • vue2 中 el-table 实现树形列表,支持增删改等操作
    需求场景:el-table构造一个树形列表,支持新增节点,删除,修改等操作。实现效果思路 一般的el-table增删改,我们都很熟悉;关键在于实现一个纯前端的树形列表,最终再调接口存列表数据。     树形el-table,需要设置 row-key,一般为id,所以每新增一条数据,都必须有id。需......
  • 查找列表(表格的列名)是否包含某些列名字符串
    lis=["非关键词","关键词1","/s关键词2/s","重复的关键词1"]keywords=["关键词1","关键词2","关键词3"]result={}foriinkeywords:find=Falseforj,kinenumerate(lis):ifnotfind:......
  • NetSuite 开发日记:如何管理多环境自定义列表值
    在NetSuite中可以创建自定义列表,列表可用于为其他(自定义)记录上的下拉选项列表值。varrec=record.create({type:'customrecord_xx'});rec.setValue({fieldId:'custrecord_xx_fld',value:'1'});rec.save();我们设置自定义列表值,需要使用该值的内......
  • java 两个列表的求交集、差集和并集
    java两个列表的求交集、差集和并集importjava.util.HashSet;importjava.util.List;importjava.util.Set;publicclassSetOperations{publicstaticvoidmain(String[]args){//创建两个列表List<String>list1=Arrays.asList(......