我正在手动创建一组要放入QGridLayout中的QLabels,并且应该均匀分布。当我使用QT设计器创建一个测试窗体并添加一系列标签,并将它们放入QGridLayout中时,标签占据了它们在网格中的单元格的全部大小。当我在c++中手动执行此操作时,标签不会展开,也不会显示文本的最小尺寸。我可以让这些标签垂直扩展,但不能水平扩展。
下面是我创建QGridLayout的方法:
m_layout = new QGridLayout;
m_layout->setHorizontalSpacing( 1 );
m_layout->setVerticalSpacing( 1 );
m_layout->setContentsMargins(0,0,0,0);
m_layout->setMargin(0);
m_layout->setSizeConstraint( QGridLayout::SetDefaultConstraint );
//m_layout->setSizeConstraint( QGridLayout::SetMaximumSize );当我更改大小约束时,它根本不会影响标签的大小,所以我假设问题可能在于我如何创建标签,这是这样发生的:
QLabel *label = new QLabel;
label->setAlignment( Qt::AlignCenter );
label->setFrameStyle( QFrame::Raised );
label->setMinimumSize( QSize(0,0) );
label->setMaximumSize( QSize(16777215, 16777215) );
label->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred );现在,所有的QLabels都是相同的大小,但最终它们会有不同的大小,这就是为什么我使用压缩桶算法。我围绕这样的类设计了算法:
struct ButtonFittingNode
{
ButtonFittingNode( QRect rectangle, QGridLayout *layout )
: used( false )
, node( rectangle )
, down( NULL )
, right( NULL )
, m_layout( layout )
{ }
~ButtonFittingNode()
{
if ( down ) delete down;
if ( right ) delete right;
}
ButtonFittingNode *findNode( QLabel *btn )
{
int w = 1;
int h = 1;
if ( this->used )
{
ButtonFittingNode *bfn = NULL;
if ( this->right ) bfn = this->right->findNode( btn );
if ( this->down && !bfn ) bfn = this->down->findNode( btn );
return bfn;
}
else if ( ( w <= node.width() ) && ( h <= node.height() ) )
{
qDebug() << "Placing at " << node.x() << node.y();
m_layout->addWidget( btn, node.y(), node.x(), w, h, Qt::AlignJustify );
this->used = true;
this->splitNode( QSize( w, h ) );
return this;
}
return NULL;
}
void splitNode( QSize sz )
{
int w = 0, h = 0;
// Create a down node
w = this->node.width();
h = this->node.height() - sz.height();
if ( h > 0 )
{
QRect n( this->node.x(), this->node.y() + sz.height(), w, h );
this->down = new ButtonFittingNode( n, m_layout );
}
// Create a right node
w = this->node.size().width() - sz.width();
h = sz.height();
if ( w > 0 )
{
QRect n( this->node.x() + sz.width(), this->node.y(), w, h );
this->right = new ButtonFittingNode( n, m_layout );
}
}
bool used;
QRect node;
ButtonFittingNode *down;
ButtonFittingNode *right;
private:
QGridLayout *m_layout;
};使用3x2网格,我得到以下输出:

对不起,我不得不模糊文字,因为这是一个工作相关的项目,但灰色是背景,白色是标签的背景。如你所见,他们个子很高,但很瘦。我希望这些标签又高又胖。我是否设置了一些错误的属性?
发布于 2013-10-08 04:09:09
这一切都非常简单。布局的大小限制与您所看到的没有任何关系。您还包含了一堆无用的样板代码。摆脱最小和最大尺寸的显式设置,除非你有一些非默认的尺寸。这是完全无用的:
label->setMinimumSize( QSize(0,0) );
label->setMaximumSize( QSize(16777215, 16777215) );您需要在水平方向上将标签的sizePolicy设置为Expanding。这就是所有的事情:
label->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );我知道您希望从bin打包系统中获得什么,但它不能很好地工作,因为网格中的列/行大小会随着网格大小的改变而变化。您的包装器将根据当前行/列大小选择一些列/行跨度。在调整大小后,包装器的决定将不再足够。
您真正想要的是一个自定义布局,它可以在运行时完成所有的打包工作。 可能与您想要的非常接近。
https://stackoverflow.com/questions/19229542
复制相似问题