Квадратные пользовательские 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).

2

Решение

Кажется, ты пропал 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();
3

Другие решения


По вопросам рекламы [email protected]