QSridLayout里面的QScrollArea中的方形自定义QWidgets

时间:2015-06-05 17:10:33

标签: c++ qt qwidget qscrollarea qgridlayout

我正在尝试在QGridLayout和QScrollArea中布置一个方形自定义(子类)QWidgets的网格。

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

我已经尝试过的是

  1. 手动布置/调整QWidgets的大小,但这很草率和缓慢
  2. QScrollArea::widgetsResized设置为true可正确调整宽度,但不能调整高度,请参阅screenshot
  3. 我已尝试设置QSizePolicy并覆盖QWidget::heightForWidth以及在我的自定义QWidget派生类中设置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)。

1 个答案:

答案 0 :(得分:3)

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