QT自定义QListWidget的item

将自定义的widget作为QListWidget的item

上一篇文章自定义了可以折叠的窗口(链接),现在将其添加到QListWidget中,效果如下。QT自定义QListWidget的item_第1张图片

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);
}

这里添加了十个窗口,结果窗口展开的时候,后面的窗口并没有往下移动
QT自定义QListWidget的item_第2张图片

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 

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 

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 

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 
#include 

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;
    }
}

你可能感兴趣的:(QT,qt)