将自定义的widget作为QListWidget的item
上一篇文章自定义了可以折叠的窗口(链接),现在将其添加到QListWidget中,效果如下。
1.如何将自定义widget添加到QListWidget中
void Widget::addWidgetItem(SlaveWidget *sw)
{
QListWidgetItem* item = new QListWidgetItem;
item->setSizeHint(sw->size());
ui->listWidget->addItem(item);
ui->listWidget->setItemWidget(item, sw);
}
这里添加了十个窗口,结果窗口展开的时候,后面的窗口并没有往下移动
2.当窗口改变大小的时候发送信号,连接槽函数改变item的大小
void Widget::addWidgetItem(SlaveWidget *sw)
{
QListWidgetItem* item = new QListWidgetItem;
item->setSizeHint(sw->size());
connect(sw, &SlaveWidget::sizeChange, [item](int h){
item->setSizeHint(QSize(item->sizeHint().width(), h));
});
ui->listWidget->addItem(item);
ui->listWidget->setItemWidget(item, sw);
}
大功告成
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
class SlaveWidget;
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
void addWidgetItem(SlaveWidget*);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "slavewidget.h"
#include <QScrollBar>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui->listWidget->setSpacing(5);
for(int i=0; i<10; i++){
addWidgetItem(new SlaveWidget);
}
}
Widget::~Widget()
{
delete ui;
}
void Widget::addWidgetItem(SlaveWidget *sw)
{
QListWidgetItem* item = new QListWidgetItem;
item->setSizeHint(sw->size());
connect(sw, &SlaveWidget::sizeChange, [item](int h){
item->setSizeHint(QSize(item->sizeHint().width(), h));
});
ui->listWidget->addItem(item);
ui->listWidget->setItemWidget(item, sw);
}
slavewidget.h
#ifndef SLAVEWIDGET_H
#define SLAVEWIDGET_H
#include <QWidget>
namespace Ui {
class SlaveWidget;
}
class SlaveWidget : public QWidget
{
Q_OBJECT
public:
explicit SlaveWidget(QWidget *parent = nullptr);
~SlaveWidget();
signals:
void sizeChange(int);
private slots:
void slotShowWidget();
private:
Ui::SlaveWidget *ui;
bool _showFlg; //是否显示了下半部分窗口
};
#endif // SLAVEWIDGET_H
slavewidget.cpp
#include "slavewidget.h"
#include "ui_slavewidget.h"
#include <QDebug>
#include <QPropertyAnimation>
SlaveWidget::SlaveWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::SlaveWidget),
_showFlg(false)
{
ui->setupUi(this);
this->setFixedHeight(100); //设置下半部分窗口隐藏
connect(ui->btnScale, &QPushButton::clicked, this, &SlaveWidget::slotShowWidget);
}
SlaveWidget::~SlaveWidget()
{
delete ui;
}
void SlaveWidget::slotShowWidget()
{
QPropertyAnimation* animation = new QPropertyAnimation(this, ""); //qt动画类
animation->setDuration(500); //动画持续时间500ms
if(!_showFlg){
ui->btnScale->setIcon(QIcon(tr(":/Image/ArrowUp.png")));
animation->setStartValue(100);//动画开始值和结束值
animation->setEndValue(500);
connect(animation, &QPropertyAnimation::valueChanged, [this](const QVariant& value){
this->setFixedHeight(value.toInt());
emit sizeChange(value.toInt());
});
animation->start(QAbstractAnimation::DeleteWhenStopped);
_showFlg = true;
}
else {
ui->btnScale->setIcon(QIcon(":/Image/ArrowDown.png"));
animation->setStartValue(500);
animation->setEndValue(100);
connect(animation, &QPropertyAnimation::valueChanged, [this](const QVariant& value){
this->setFixedHeight(value.toInt());
emit sizeChange(value.toInt());
});
animation->start(QAbstractAnimation::DeleteWhenStopped);
_showFlg = false;
}
}