首页 文章

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

提问于
浏览
2

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

我想要它的工作方式是选择 QGridLayout 列的数量并创建正确大小的方块 .

我已经尝试过的是

  • 手动布置/调整QWidgets的大小,但这很邋and而且很慢

  • QScrollArea::widgetsResized 设置为true可正确调整宽度,但不能调整高度,请参阅screenshot .

我已经尝试设置 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 回答

  • 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();
    

相关问题