QToolBox - Разгъване на множество елементи

Трябва да направя QToolBox с множество разширяващи се елементи/приспособления, така че когато потребителят щракне веднъж, елементът се разширява, когато щракне още веднъж, елементът се свива, така че всички елементи да не могат да бъдат разгънати едновременно. Може да се добави вертикална лента за превъртане, ако няма достатъчно място за всички елементи, които да бъдат разгънати.

въведете описание на изображението тук

Някой има ли идея/решение как мога да постигна това?


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


Отговори (2)


За решение на този проблем направих персонализирана разширяваща се джаджа със заглавка и тяло, когато щракването върху тялото на заглавката е скрито, комбинация от повече разширяващи се джаджи и разделител във вертикално оформление може да имате същия ефект с 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;

}
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

toolbox.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