I need something similar to a QToolBox
with multiple expanding items / widgets that - as opposed to a QToolBox
- supports displaying more than a single item at a time: When the user clicks on the item, it should expand; upon a second click, it should collapse: All, some or no items may be expanded at the same time.
Vertical scrollbars should be added if there is not enough space for all expanded items to be shown.
Does anyone have an idea / a solution how can I accomplish this?
For solution for this problem I made a custom expanding widget with header and body when click on header body is hidden, combination of more expanding widgets and a spacer in a vertical layout you may have the same effect with QToolbox
.
expandwidget.h
:
#ifndef EXPANDWIDGET_H
#define EXPANDWIDGET_H
#include <QWidget>
#include <QLabel>
class ExpandWidgetHeader : public QLabel
{
Q_OBJECT
public:
explicit ExpandWidgetHeader(QWidget *parent = 0);
~ExpandWidgetHeader();
signals:
void headerClicked(bool hide);
private:
virtual void mousePressEvent(QMouseEvent * event);
bool m_isHidden;
// QLabel* headerTitle;
};
//================================================================
class ExpandWidget : public QWidget
{
Q_OBJECT
public:
explicit ExpandWidget(QWidget *parent = 0);
public slots:
void hideBody(bool hide);
public:
ExpandWidgetHeader *Header;
QWidget *Body;
};
#endif // EXPANDWIDGET_H
expandwidget.cpp
:
#include "expandwidget.h"
ExpandWidget::ExpandWidget(QWidget *parent) :
QWidget(parent)
{
this->setStyleSheet("border: 1px solid #000000; background: #C4C4C1");
setMinimumSize(QSize(330, 100));
Header = new ExpandWidgetHeader(this);
Body = new QWidget(this);
Body->setGeometry(QRect(0, 25, 330, 100));
connect(Header,SIGNAL(headerClicked(bool)),this,SLOT(hideBody(bool)));
}
void ExpandWidget::hideBody(bool hide)
{
if (!hide)
{
Body->hide();
this->setMinimumHeight(Header->height());
}
else
{
this->setMinimumHeight(Body->height()+Header->height());
Body->show();
}
}
//=========================================================================
ExpandWidgetHeader::ExpandWidgetHeader(QWidget *parent) :
QLabel(parent)
{
m_isHidden=false;
this->setText("Text");
this->setStyleSheet("border: 1px solid #000000; background: #898983");
this->setGeometry(QRect(0, 0, 330, 25));
this->setAlignment(Qt::AlignCenter);
}
ExpandWidgetHeader::~ExpandWidgetHeader()
{
}
void ExpandWidgetHeader::mousePressEvent(QMouseEvent *event)
{
if (!m_isHidden)
{
emit headerClicked(m_isHidden);
}
else
{
emit headerClicked(m_isHidden);
}
m_isHidden = !m_isHidden;
}