QScrollArea 动态添加控件

本文介绍了如何在项目中使用QScrollArea实现动态添加QWidget并保持其超出屏幕高度时自动扩容和滚动。通过创建Widget类,控制按钮添加和删除控件,以及调整scrollArea大小来达到滚动效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中写了一个控件,而且可以根据配置动态的往布局里面增加QWidget,由于内容比较多,很容易就超出了屏幕高度范围,所以就需要QScrollArea在动态添加控件的时候能自动扩容与滚动

Widget.h

#include <QWidget>
#include <QBoxLayout>
#include <QScrollArea>
#include <QLabel>
#include <QPushButton>
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

public slots:
    void on_add_clicked(void);
    void on_del_clicked(void);

private:
    void init(void);
    void init_membervars(void);
    void init_ui(void);
    void init_event(void);

private:
    QVBoxLayout     *m_layout;

    QScrollArea     *m_scrollArea;

    QWidget         *m_widget;
    QVBoxLayout     *m_layoutWidget;

    QPushButton     *m_buttonAdd;
    QPushButton     *m_buttonDel;

    int             m_index;
    int             m_baseHeight;
};

Widget.cpp

#include "widget.h"

#include <QLayoutItem>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    init();
}

Widget::~Widget()
{
}

void Widget::init(void) {
    init_membervars();
    init_ui();
    init_event();
}

void Widget::init_membervars(void) {
//    m_layout = new QVBoxLayout(this);
    m_scrollArea = new QScrollArea(this);

    m_widget = new QWidget(this);
    m_layoutWidget = new QVBoxLayout;

    m_buttonAdd = new QPushButton("Add", this);
    m_buttonDel = new QPushButton("Del", this);

    m_index = 0;

    m_baseHeight = 300;
}

void Widget::init_ui(void) {
    m_layoutWidget->setMargin(0);
    m_layoutWidget->setContentsMargins(0, 0, 0, 0);
    m_layoutWidget->setAlignment(Qt::AlignTop);

    m_widget->setFixedWidth(200);
//    m_widget->setFixedHeight(300);
    m_widget->setLayout(m_layoutWidget);


    m_scrollArea->setFixedWidth(400);
    m_scrollArea->setFixedHeight(300);
    m_scrollArea->setWidget(m_widget);
    m_scrollArea->setContentsMargins(0,0,0,0);

    m_buttonAdd->setGeometry(200, 0, 60, 40);
    m_buttonDel->setGeometry(200, 40, 60, 40);
}

void Widget::init_event(void) {
    connect(m_buttonAdd, &QPushButton::clicked, this, &Widget::on_add_clicked);
    connect(m_buttonDel, &QPushButton::clicked, this, &Widget::on_del_clicked);
}

void Widget::on_add_clicked(void) {

    qDebug()<<"-- Widget::on_add_clicked()";
    QLabel *label = new QLabel("hello");
    m_layoutWidget->addWidget(label);
    m_scrollArea->ensureWidgetVisible(label);

    int size = m_layoutWidget->count();

    m_widget->setFixedHeight(size*20);
}

void Widget::on_del_clicked(void) {
    qDebug()<<"-- Widget::on_del_clicked()";
    int size = m_layoutWidget->count();

    if(size <= 0)
        return;

    QLayoutItem *item = m_layoutWidget->itemAt(size-1);
    m_layoutWidget->removeItem(item);
    delete item->widget();
}

效果:
效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值