项目中写了一个控件,而且可以根据配置动态的往布局里面增加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();
}
效果: