[英]Stretching a QLabel in a QGridLayout
我正在手動創建一組放置在QGridLayout中的QLabel,並且應該均勻分布。 當我使用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 );
現在,所有QLabel的大小都相同,但是最終它們將具有不同的大小,這就是為什么我使用打包bin算法的原因。 我圍繞這樣的類設計了算法:
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網格,我得到以下輸出:
抱歉,我必須模糊文本,因為這是與工作相關的項目,但是灰色是背景,白色是標簽的背景。 如您所見,它們很高,但很瘦。 我希望這些標簽又高又胖。 我是否將某些屬性設置錯誤?
這真的很簡單。 布局的大小限制與您所看到的無關 。 您還包括了許多無用的樣板代碼。 除非明確考慮了一些非默認尺寸,否則請擺脫對最小和最大尺寸的明確設置。 這是完全沒有用的:
label->setMinimumSize( QSize(0,0) );
label->setMaximumSize( QSize(16777215, 16777215) );
您需要將標簽的sizePolicy
設置為在水平方向上Expanding
。 這就是全部:
label->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
我看到了您希望從裝箱系統中得到的東西,但是它並不能很好地工作,因為網格的列/行大小會隨着網格大小的變化而變化。 您的包裝員將根據當前行/列的大小選擇某些列/行跨度。 調整大小后,打包機的決策不再足夠。
您真正想要的是一種自定義布局,可以即時進行所有打包。 流布局示例可能與您想要的非常接近。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.