QToolBox — расширение нескольких элементов

Мне нужно сделать QToolBox с несколькими расширяющимися элементами/виджетами, поэтому, когда пользователь щелкает один раз, элемент расширяется, когда щелкает еще раз, элемент рушится, поэтому все ни один элемент не может быть расширен одновременно. Вертикальную полосу прокрутки можно добавить, если для развертывания всех элементов недостаточно места.

введите здесь описание изображения

У кого-нибудь есть идея/решение, как я могу это сделать?


person Angel.Risteski    schedule 28.03.2015    source источник


Ответы (2)


Для решения этой проблемы я сделал собственный расширяющийся виджет с заголовком и телом, когда щелчок по телу заголовка скрыт, комбинация большего количества расширяющихся виджетов и разделителя в вертикальном макете, вы можете иметь тот же эффект с QToolbox

расширитьвиджет.ч:

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

}
person Angel.Risteski    schedule 01.04.2015
comment
Прохладный. Я пытался использовать это и кажется, что я потерял, как применить это. Можете ли вы помочь мне здесь с этим? - person Gary; 09.03.2017

Если я правильно вас понял, вы имеете в виду, что не хотите, чтобы панель инструментов отображала два элемента одновременно. т. е. если один элемент развернут, все остальные элементы должны оставаться закрытыми.

набор инструментов.h

#ifndef TOOLBOX_H
#define TOOLBOX_H

#include <QDialog>

#include <QToolBox>
#include <QLabel>
#include <QVBoxLayout>

class ToolBox : public QDialog
{
    Q_OBJECT

public:
    explicit ToolBox(QWidget *parent = 0);
    ~ToolBox();

private:
    QToolBox *toolBox;
    QLabel *label1;
    QLabel *label2;
    QLabel *label3;

};

#endif // TOOLBOX_H

набор инструментов.cpp

#include "toolbox.h"
#include "ui_toolbox.h"

ToolBox::ToolBox(QWidget *parent) : QDialog(parent) {
    label1 = new QLabel("first item");
    label2 = new QLabel("second item");
    label3 = new QLabel("third item");

    toolBox = new QToolBox;
    toolBox->addItem(label1, "page 1");
    toolBox->addItem(label2, "page 2");
    toolBox->addItem(label3, "page 3");

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(toolBox);

    setLayout(layout);
}

ToolBox::~ToolBox() {
    delete toolBox;
    delete label1;
    delete label2;
    delete label3;
}

main.cpp

#include "toolbox.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    ToolBox *window = new ToolBox;
    window->show();

    return a.exec();
}
person Paa K    schedule 28.03.2015