Я вручную создаю набор 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, я получаю следующий вывод:
Извините, мне пришлось размыть текст, так как это проект, связанный с работой, но серый — это фон, белый — это фон метки. Как видите, они высокие, но худые. Я хочу, чтобы эти ярлыки были высокими и толстыми. Я неправильно устанавливаю некоторые атрибуты?
Это все действительно просто. Ограничение размера макета ничего такого делать с тем, что вы видите. Вы также включаете кучу бесполезного шаблонного кода. Избавьтесь от явных настроек минимального и максимального размеров, если вы не имеете в виду некоторые нестандартные размеры. Это совершенно бесполезно:
label->setMinimumSize( QSize(0,0) );
label->setMaximumSize( QSize(16777215, 16777215) );
Вам нужно установить ярлык sizePolicy
в Expanding
в горизонтальном направлении. Вот и все, что нужно сделать:
label->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
Я вижу, что вы хотите от вашей системы упаковки бинов, но она не будет работать очень хорошо, как есть, так как размеры столбцов / строк в сетке будут меняться по мере изменения размера сетки. Ваш упаковщик выберет несколько столбцов / рядов на основе тогда ток размеры строк / столбцов. После изменения размера решения упаковщика больше не будут адекватными.
То, что вы действительно хотите, это пользовательский макет, который делает всю упаковку на лету. пример компоновки потока может быть очень близко к тому, что вы хотите.
Других решений пока нет …