【问题标题】:QT layout widget resizingQT 布局小部件调整大小
【发布时间】:2014-10-16 10:23:26
【问题描述】:

我在 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 设置一个最大高度,但这似乎不起作用。哦,每个widget都包含一个QVBoxLayout,其中title和QtextEdit被插入,然后widget列表是另一个QVBoxLayout,所有widget都被插入其中。

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

构造函数:

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]);

    }

【问题讨论】:

  • 你用什么来获取下图的? QTextEdit1 -&gt;setVisible(false)?
  • 我试过了,是的。还有QVBoxLayout.removeWidget(QTextEdit1),然后在展开时再次添加。但似乎都没有达到预期的效果。
  • 你能简化你的问题并显示一些代码吗?
  • 我无法重现此内容。你能发一些SSCCE吗?
  • 您将小部件的垂直尺寸策略设置为QSizePolicy::Fixed。这可能就是为什么在您将 textEdit 小部件隐藏在其中之后,您的小部件不会调整大小的原因。

标签: c++ qt


【解决方案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;
}

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

【讨论】:

  • 谢谢!!此外,当我关闭一个小部件时,为了防止所有小部件展开而缺少的是将 QT::AlignTop 设置为 mainLayout (你做了):)
  • @gumlym 是的,默认的布局对齐方式是居中,不太适合类似列表的小部件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多