QScrollArea 内的 QGridLayout 内的方形自定义 QWidgets
Square custom QWidgets inside QGridLayout inside QScrollArea
我正在尝试在 QGridLayout 和 QScrollArea 中布置方形自定义 (subclassed) QWidgets 网格。
我希望它的工作方式是选择 QGridLayout
列的数量并创建正确大小的正方形。
我已经尝试过的是
- 手动放置 out/resizing QWidgets 但这很草率而且很慢
- 将
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();
我正在尝试在 QGridLayout 和 QScrollArea 中布置方形自定义 (subclassed) QWidgets 网格。
我希望它的工作方式是选择 QGridLayout
列的数量并创建正确大小的正方形。
我已经尝试过的是
- 手动放置 out/resizing QWidgets 但这很草率而且很慢
- 将
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();