2013-10-07 5 views
2

Я вручную создаю набор 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 сетку, я получаю следующий результат:

enter image description here

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

ответ

2

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

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

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

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

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

Что вы действительно хотите, это индивидуальный макет, который делает всю упаковку «на лету». flow layout example может быть очень близок к тому, что вы хотите.

+0

Ну, с упаковщиком я фактически определяю размер, и он работает так, как ожидалось. Установка политики горизонтального размера в QSizePolicy :: Expanding не работала так, как вы предполагали, но теперь, когда я тестировал еще несколько, она работает, если я не устанавливаю никаких данных выравнивания при добавлении виджета в макет. Я включил весь этот бесполезный шаблонный код, чтобы попытаться определить, почему мои ярлыки не ведут себя так, как ожидалось. Кроме того, в моей тестовой форме разработчик политики размера на этикетке был QSizePolicy :: Предпочитаемый как для горизонтальной, так и для вертикальной, и работал как ожидалось. – OzBarry

+0

Это все, спасибо, спасибо за помощь, но я все еще смущен, почему выравнивание в сетке вызвало нарушение размера. – OzBarry

+0

@OzBarry: Наверное, потому что это поведение макета сетки. Это может быть ошибка или функция. –

Смежные вопросы