Квадратные пользовательские QWidgets внутри QGridLayout внутри QScrollArea

Я пытаюсь выложить сетку квадратных пользовательских (подклассов) QWidgets внутри QGridLayout и QScrollArea.

Я хочу, чтобы это работало, выбирая количество QGridLayout столбцов и создавая квадраты правильных размеров.

То, что я уже пробовал сделать,

  1. Раскладка / изменение размера QWidgets вручную, но это было неаккуратно и медленно
  2. Установка QScrollArea::widgetsResized в значение true, которое правильно изменяет ширину, но не высоту, см. снимок экрана < / а>.

Я пробовал установить QSizePolicy и переопределить QWidget::heightForWidth вместе с установкой QScrollArea::widgetsResized в моем настраиваемом классе, производном от QWidget, например:

CustomWidget::CustomWidget(...) 
{  
  ...

  QSizePolicy policy(QSizePolicy::Preferred, QSizePolicy::Preferred);
  policy.setHeightForWidth(true);

  setSizePolicy(policy);
}

...

int CustomWidget::heightForWidth(int width) const
{
    return width; // square
}

Но CustomWidget::heightForWidth никогда не вызывается.

Любая помощь будет оценена.

РЕДАКТИРОВАТЬ: я уже сделал то, что предложил этот ответ, мои пользовательские виджеты находятся в макете (QGridLayout).


person blashyrk    schedule 05.06.2015    source источник
comment
возможный дубликат QWidget :: heightForWidth () не вызывается   -  person m.s.    schedule 05.06.2015
comment
Вы пробовали вызывать setFixedSize для каждого виджета?   -  person Pavel Strakhov    schedule 05.06.2015
comment
@PavelStrakhov Мне не нужен фиксированный размер, мне нужен тот же height, что и для каждой (переменной) ширины. Я попытался переопределить sizeHints(), но это не сработало, так как мне нужно вернуть ширину и высоту в этом методе.   -  person blashyrk    schedule 05.06.2015
comment
@РС. Это не дубликат, так как я делаю то, что предлагал принятый ответ. Мои пользовательские QWidgets уже находятся в макете. Кроме того, вы можете захотеть прочитать вопрос, когда в следующий раз отметите что-то как дубликат. Спасибо.   -  person blashyrk    schedule 05.06.2015


Ответы (1)


Кажется, вам не хватает hasHeightForWidth реализации. Следующий фрагмент отлично работает:

class MyWidget : public QTextEdit {
public:
  MyWidget() {}
  int heightForWidth(int width) const {
    return width;
  }
  bool hasHeightForWidth() const {
    return true;
  }
};
//...
QScrollArea area;
QWidget* widget = new QWidget();
QGridLayout* layout = new QGridLayout(widget);
area.setWidget(widget);
area.setWidgetResizable(true);
for(int row = 0; row < 10; row++) {
  for(int column = 0; column < 4; column++) {
    layout->addWidget(new MyWidget(), row, column);
  }
}
area.show();
person Pavel Strakhov    schedule 05.06.2015