QToolBox - 展开多个项目

问题描述 投票:0回答:2

我需要类似于

QToolBox
的东西,具有多个扩展项目/小部件,与
QToolBox
相反,它支持一次显示多个项目:当用户单击该项目时,它应该展开;第二次单击时,它应该折叠:所有、部分或没有项目可以同时展开。 如果没有足够的空间来显示所有展开的项目,则应添加垂直滚动条。

Sample screenshot

有人有想法/解决方案吗?我怎样才能做到这一点?

c++ qt qwidget
2个回答
3
投票

为了解决这个问题,我制作了一个带有标题和正文的自定义扩展小部件,当单击标题主体被隐藏时,更多扩展小部件和垂直布局中的分隔符的组合可能会产生与

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;

}

1
投票

如果我理解正确的话,你的意思是你不希望工具箱同时显示两个项目。即,如果一项已展开,则所有其他项应保持关闭状态。

工具箱.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;
}

主.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();
}
© www.soinside.com 2019 - 2024. All rights reserved.