我在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]);
}
答案 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;
}
单击按钮将隐藏或显示小部件的文本编辑。如果隐藏文本编辑,则窗口小部件将缩小,如果显示,则窗口小部件将展开。