在过去的几天里,我试图解决 Qt 布局系统的一个特定问题。我会尝试概括它:我有一个有两行的小部件。在第一行有树按钮(或任何其他控件)。他们的布局如图所示:
中心按钮占用了所有可用的额外空间(并且随着小部件的大小增加而扩展)。问题是我想以编程方式调整中心小部件(按钮)的大小并保持布局。使用我当前的实现,当我调整中心按钮的大小时,会发生以下情况:
我希望右键在中心按钮的右侧对齐(没有额外的空间)。现在,当我调整小部件的大小时,它会回到位置 1(中心占用所有额外空间),但这不是我想要的效果。
这是我当前的实现:
#include "Widget_Old.h"
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QDebug>
WidgetOld::WidgetOld(QWidget *parent) :
QWidget(parent)
{
QVBoxLayout* mainLayout = new QVBoxLayout( this );
QWidget* firstRowWidget = new QWidget( this );
QPushButton* left = new QPushButton;
left->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred );
left->setText( "left" );
m_center = new QPushButton;
m_center->setText( "centerr");
m_center->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
QPushButton* right = new QPushButton;
right->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred );
right->setText( "right" );
QHBoxLayout* firstRowLayout = new QHBoxLayout( firstRowWidget );
firstRowLayout->addWidget( left );
firstRowLayout->addWidget( m_center );
firstRowLayout->addWidget( right );
QHBoxLayout* secondRowLayout = new QHBoxLayout;
QPushButton* button = new QPushButton( "resize" );
connect( button, SIGNAL(clicked()), SLOT(decrement()) );
secondRowLayout->addWidget( button );
mainLayout->addWidget( firstRowWidget );
mainLayout->addLayout( secondRowLayout );
}
WidgetOld::~WidgetOld()
{
}
void WidgetOld::decrement()
{
qDebug() << "Changing width from " << m_center->width() << " to " << m_center->width()/2;
m_center->resize( m_center->width()/2, m_center->height() );
}
笔记:
我尝试对齐中心和右侧小部件 Qt::AlignLeft,但没有结果。实际上,当在布局中左对齐小部件时,它会尝试采用最小尺寸,这会破坏扩展功能:(
如果需要任何参考,我已经分享了我的代码: https ://drive.google.com/file/d/0B-mc4aKkzWlxTWdNNmpuQ0ptQ3M/edit?usp=sharing
感谢您阅读我的帖子,希望您知道解决方案:)