LINUX.ORG.RU

Центрирование виджета в QGridLayout

 ,


0

2

Всем добрый вечер.
Подскажите как быть: имеется QGridLayout на основной форме, внутри ячеек компоновщика нужно разместить по одному квадратному(!) виджету так, чтобы:

  • при масштабировании основной формы менялись размеры виджетов в ячейках (при сохранении квадратных пропорций)
  • виджеты были центрированы относительно ячеек


Пока не получается выполнить два условия одновременно. Такое ощущение, что я вообще что-то не так делаю.
Размещение виджетов в компоновщике выглядит следующим образом:


QWidget *workspace = new QWidget(this);
setCentralWidget(workspace);

QGridLayout *grid = new QGridLayout(workspace);
grid->setRowStretch(0,1);
grid->setColumnStretch(0,1);
grid->setRowStretch(1,6500);
grid->setColumnStretch(1,1);
grid->setRowStretch(2,6500);

Figure *f1 = new Figure;
Figure *f2 = new Figure;
grid->addWidget(f1, 0,0);
grid->addWidget(f2, 0,1);


Виджеты делаю квадратными через переопределение heightForWidth(). Для наглядности пропорций вдоль границ виджета рисую рамку:


Figure::Figure(QWidget *parent) : QWidget(parent)
{
    setWindowFlags(Qt::FramelessWindowHint);
    QSizePolicy policy(QSizePolicy::Preferred, QSizePolicy::Preferred);
    policy.setHeightForWidth(1);
    setSizePolicy(policy);
    setBaseSize(180,180);
    setMinimumSize(180,180);
    resize(180, 180);
}

void Figure::paintEvent(QPaintEvent *)
{
  QPainter paint(this);
  QRect r = geometry();
  int w=r.width();
  int h=r.height();
  paint.drawRect(3, 3, w-5, h-5);

  updateGeometry();
}

int Figure::heightForWidth(int w) const
{
  QRect r = geometry();
    if(w > r.height()) r.setHeight(w);
  return w;
}


Как это выглядит: при пропорциональном изменении основной формы по высоте/ширине все ок - вижу квадраты. При растягивании в высоту тоже. А вот при растягивании формы в ширину квадраты становятся прямоугольниками. Короче говоря, виджеты полностью заполняют все пространство ячеек, не центрируются, квадратные пропорции при растягивании в ширину нарушаются.


Пробовал так:

grid->addWidget(f1, 0,0, Qt::AlignCenter);
grid->addWidget(f2, 0,1, Qt::AlignCenter);


Виджеты центрируются, но пропорций не меняют.

все очень просто оказалось. если переопределить у виджета sizeHint(), так чтобы стороны квадрата соответствовали доступной высоте:

 
QSize Figure::sizeHint() const
{
  QRect r = geometry();
  return QSize(r.height(),r.height());
}
и отцентрировать по горизонтали при добавлении в компоновщик:
 
grid->addWidget(f1, 0,0, Qt::AlignHCenter);
grid->addWidget(f2, 0,1, Qt::AlignHCenter);
то он будет располагаться по центру ячейки и менять свои пропорции при масштабировании формы

tyro33 ()
Ответ на: комментарий от tyro33

* НЕ менять свои пропорции при масштабировании формы

tyro33 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.