Растяжение QLabel в QGridLayout

Я вручную создаю набор QLabels, которые помещаются в QGridLayout и должны распределяться равномерно. Когда я создаю тестовую форму с использованием QT Designer, добавляю серию меток и помещаю их в 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;
};

Используя сетку 3х2, я получаю следующий вывод:

введите описание изображения здесь

Извините, мне пришлось размыть текст, так как это проект, связанный с работой, но серый — это фон, белый — это фон метки. Как видите, они высокие, но худые. Я хочу, чтобы эти ярлыки были высокими и толстыми. Я неправильно устанавливаю некоторые атрибуты?

2

Решение

Это все действительно просто. Ограничение размера макета ничего такого делать с тем, что вы видите. Вы также включаете кучу бесполезного шаблонного кода. Избавьтесь от явных настроек минимального и максимального размеров, если вы не имеете в виду некоторые нестандартные размеры. Это совершенно бесполезно:

label->setMinimumSize( QSize(0,0) );
label->setMaximumSize( QSize(16777215, 16777215) );

Вам нужно установить ярлык sizePolicy в Expanding в горизонтальном направлении. Вот и все, что нужно сделать:

label->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );

Я вижу, что вы хотите от вашей системы упаковки бинов, но она не будет работать очень хорошо, как есть, так как размеры столбцов / строк в сетке будут меняться по мере изменения размера сетки. Ваш упаковщик выберет несколько столбцов / рядов на основе тогда ток размеры строк / столбцов. После изменения размера решения упаковщика больше не будут адекватными.

То, что вы действительно хотите, это пользовательский макет, который делает всю упаковку на лету. пример компоновки потока может быть очень близко к тому, что вы хотите.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]