Я вручную создаю набор QLabels, которые помещаются в QGridLayout и должны распределяться равномерно. Когда я создаю тестовую форму с помощью QT Designer и добавляю серию меток и помещаю их в QGridLayout, метки занимают полный размер своих ячеек в сетке. Когда я делаю это вручную в C++, метки не расширяются и не говорят минимальный размер для текста. Я могу заставить эти метки расширяться вертикально, но не горизонтально.Растяжение QLabel в QGridLayout
Вот как я создавая 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 сетку, я получаю следующий результат:
К сожалению, я должен был размыть текст, так как это работа связанный с проектом, но серый фон, белый - это фон ярлыка. Как видите, они высокие, но худые. Я хочу, чтобы эти ярлыки были высокими и жирными. Я устанавливаю некоторые атрибуты неправильно?
Ну, с упаковщиком я фактически определяю размер, и он работает так, как ожидалось. Установка политики горизонтального размера в QSizePolicy :: Expanding не работала так, как вы предполагали, но теперь, когда я тестировал еще несколько, она работает, если я не устанавливаю никаких данных выравнивания при добавлении виджета в макет. Я включил весь этот бесполезный шаблонный код, чтобы попытаться определить, почему мои ярлыки не ведут себя так, как ожидалось. Кроме того, в моей тестовой форме разработчик политики размера на этикетке был QSizePolicy :: Предпочитаемый как для горизонтальной, так и для вертикальной, и работал как ожидалось. – OzBarry
Это все, спасибо, спасибо за помощь, но я все еще смущен, почему выравнивание в сетке вызвало нарушение размера. – OzBarry
@OzBarry: Наверное, потому что это поведение макета сетки. Это может быть ошибка или функция. –