QScrollArea 内的 QGridLayout 内的方形自定义 QWidgets

Square custom QWidgets inside QGridLayout inside QScrollArea

我正在尝试在 QGridLayout 和 QScrollArea 中布置方形自定义 (subclassed) QWidgets 网格。

我希望它的工作方式是选择 QGridLayout 列的数量并创建正确大小的正方形。

我已经尝试过的是

  1. 手动放置 out/resizing QWidgets 但这很草率而且很慢
  2. QScrollArea::widgetsResized 设置为 true 可以正确调整宽度,但不能正确调整高度,请参阅 screenshot

我已经尝试在我的自定义 QWidget 派生 class 中设置 QSizePolicy 并覆盖 QWidget::heightForWidth 以及设置 QScrollArea::widgetsResized,如下所示:

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

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

  setSizePolicy(policy);
}

...

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

但是 CustomWidget::heightForWidth 从未被调用过。

如有任何帮助,我们将不胜感激。

编辑:我已经按照 this answer 的建议做了,我的自定义小部件在布局 (QGridLayout) 中。

您似乎缺少 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();