QT布局小部件调整大小

时间:2014-10-16 10:23:26

标签: c++ qt

我在QT中的布局有问题。我试图获得一个可以通过以下方式扩展和收缩的小部件列表:

|------------|                                            |------------|
|Title 1     |                                            |Title 1     | Widget1
|------------|                                            |------------|
|QTextEdit1  |   Widget 1                                 |Title 2     |
|            |                                            |------------|                                                  
|------------|Which, by clicking on the title, contract:  |QTextEdit2  | Widget2
|------------|                                            |            |
|Title 2     |                                            |------------|
|------------|                                                       
|QTextEdit1  |
|            |   Widget 2
|------------|

问题是,到目前为止我只能实现以下目标:(点击标题1后)

|------------|                                                      
|Title 1     |                                                     
|------------|                                                       
|            |                                                      
|            |                                                                                                   
|------------|     
|------------|                                                       
|Title 2     |                                                 
|------------|                                                       
|QTextEdit1  |
|            |
|------------|

也就是说,我能够使我的第一个小部件的QtextEdit消失,保持标题高度不变(这很重要),但第二个小部件不会替换第一个QTextEdit留下的空间。好像QtextEdit仍然存在,第二个小部件不能占用该空间。 ¿有谁知道如何解决这个问题?我感觉它并不复杂,但我环顾四周,我无法解决它。当我收缩它时,我已经尝试为widget1设置最大高度,但这似乎不起作用。哦,每个小部件都包含一个QVBoxLayout,其中插入了title和QtextEdit,然后小部件列表是另一个QVBoxLayout,其中插入了所有小部件。

已编辑:按要求添加了一些源代码

构造

mainLayout = new QVBoxLayout;
QHBoxLayout *headerLayout = new QHBoxLayout;
title = new QLabel("My title!!");

m_arrowLabel->setPixmap(m_arrowDown);
m_activated = true;
title->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
title->setMaximumHeight(16);
headerLayout->addWidget(title, 0, Qt::AlignLeft);
headerLayout->setContentsMargins(0,0,0,0);

textEdit = new QTextEdit;
textEdit->setReadOnly(true);
textEdit->setText("My text!!!");
textEdit->setMaximumHeight(textEdit->document()->size().height() + 50);

mainLayout->addLayout(headerLayout);
mainLayout->addWidget(textEdit);
mainLayout->setContentsMargins(QMargins(0,0,0,0));
this->setLayout(mainLayout);

鼠标新闻事件:

event->accept();
if (event->buttons() & Qt::LeftButton)
{
    if (m_activated)
    {
        m_activated = false;
        textEdit->setVisible(false);

    }else
    {
        m_activated = true;
        textEdit->setVisible(true);
    }
}

在我的窗口中,我用小部件填充它:

    m_mainLayout = QVector<QVBoxLayout *> (10);

    for (int i=0; i<m_mainLayout.size(); i++)
    {
        myWidget[i] = new myWidget;
        myWidget[i]->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
        m_mainLayout->addWidget(myWidget[i]);

    }

1 个答案:

答案 0 :(得分:1)

您正在为小部件设置固定的垂直尺寸政策。这就是为什么当你在其中隐藏文本编辑时,它们不会缩小。如果要限制窗口小部件的高度,请使用QWidget::setMaximumHeight

这是一个小工作示例:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLayout>
#include <QLabel>
#include <QPushButton>
#include <QTextEdit>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    centralWidget()->setLayout(new QVBoxLayout);
    centralWidget()->layout()->setAlignment(Qt::AlignTop);

    for(int i = 0; i < 10; i++)
    {
        QWidget *widget = new QWidget;
        widget->setMaximumHeight(200);
        widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
        QVBoxLayout *w_layout = new QVBoxLayout;
        widget->setLayout(w_layout);
        QHBoxLayout *top_layout = new QHBoxLayout;
        top_layout->addWidget(new QLabel("Title"));
        QPushButton *toggle_button = new QPushButton("Toggle");
        top_layout->addWidget(toggle_button);
        toggle_button->setCheckable(true);
        QTextEdit *text_edit = new QTextEdit;
        connect(toggle_button, SIGNAL(clicked(bool)), text_edit, SLOT(setHidden(bool)));
        w_layout->addLayout(top_layout);
        w_layout->addWidget(text_edit);

        centralWidget()->layout()->addWidget(widget);
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

单击按钮将隐藏或显示小部件的文本编辑。如果隐藏文本编辑,则窗口小部件将缩小,如果显示,则窗口小部件将展开。