滚动区域中的自定义小部件不遵守最小值?
Custom widgets in scroll area not respecting minimum?
我离 QScrollArea 的工作越来越近了,但它仍在缩小我添加的自定义小部件。一切都在流畅地调整大小,如果滚动区域太小,就会出现滚动条,所以它显然有一些最小尺寸的想法。
开始时,滚动区域有两个自定义小部件,您可以看到一些收缩:
临界点以下同样window。文本现在完全消失了,但它不会收缩 QLineEdit,所以它最终添加了一个滚动条。 (滚动区域的背景为蓝色,内容小部件为紫色)
我从设计开始,但滚动区域小部件下方的所有内容都在代码中,因为我无法使用设计使垂直布局正常工作。
这里是起点:
StackWidget 中有一个页面有两个垂直布局的元素。滚动区域有一个 QWidget。 MainWindow 的构造函数定义了一个垂直布局,将其分配给成员 scrollWidgetLayout
,并将该布局提供给滚动区域的小部件:
scrollWidgetLayout = new QVBoxLayout(ui->scrollAreaWidgetContents);
ui->scrollAreaWidgetContents->setLayout(scrollWidgetLayout);
应用程序在堆栈小部件的第一页启动,用户登录,然后应用程序运行以从服务器获取记录。每条记录都变成一个小部件:
RecordFolderWidget::RecordFolderWidget(Record *r, QWidget *parent) : QWidget(parent)
{
record = r;
//setSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding);
QGridLayout *layout = new QGridLayout();
pathLineEdit = new QLineEdit();
finderButton = new QPushButton("...");
QLabel *nameLabel = new QLabel(record->name);
layout->setSpacing(5);
layout->setMargin(3);
layout->addWidget(nameLabel, 0, 0, 0, 1, Qt::AlignCenter);
layout->addWidget(pathLineEdit, 1, 0);
layout->addWidget(finderButton, 1, 1);
setLayout(layout);
//setMinimumHeight(sizeHint().height());
}
请注意,有些行被注释掉了,这些是我一直在尝试让它发挥作用的东西。顺便说一句,sizeHint 似乎是正确的,并且不会改变。
创建小部件后,它会添加到滚动区域的小部件中:
RecordFolderWidget *rf = new RecordFolderWidget(record);
rf->setParent(ui->scrollAreaWidgetContents);
scrollWidgetLayout->addWidget(rf);
我在这里也尝试调整滚动区域内容的大小,但没有成功:
ui->scrollAreaWidgetContents->resize(rfSize.width(), rfSize.height() * records.count());
其中 rfSize 是在创建自定义小部件后从其 sizeHint 中提取的,并且在循环到 create/add 所有小部件之后调用此行一次。
除了上面的 setMinimumHeight 和 resize 之外,我还尝试将 scrollAreaWidgetContents 的 SizePolicy 从 preferred 更改为 expanding 到 minimumexpanding,但没有发现任何区别。我确定我错过了一些微不足道的东西,但就是找不到。
我在你的代码中看到的问题是在添加 QLabel 时你将 rowSpan 设置为 0,我已经更改它并且我可以正确观察它。在下一部分中,我将展示我的测试代码和结果:
QVBoxLayout *scrollWidgetLayout = new QVBoxLayout(ui->scrollAreaWidgetContents);
for(int i=0; i<10; i++){
QWidget *widget = new QWidget;
QGridLayout *layout = new QGridLayout(widget);
QLineEdit *pathLineEdit = new QLineEdit;
QPushButton *finderButton = new QPushButton("...");
QLabel *nameLabel = new QLabel(QString("name %1").arg(i));
layout->setSpacing(5);
layout->setMargin(3);
layout->addWidget(nameLabel, 0, 0, 1, 1, Qt::AlignCenter);
layout->addWidget(pathLineEdit, 1, 0);
layout->addWidget(finderButton, 1, 1);
scrollWidgetLayout->addWidget(widget);
}
我离 QScrollArea 的工作越来越近了,但它仍在缩小我添加的自定义小部件。一切都在流畅地调整大小,如果滚动区域太小,就会出现滚动条,所以它显然有一些最小尺寸的想法。
开始时,滚动区域有两个自定义小部件,您可以看到一些收缩:
临界点以下同样window。文本现在完全消失了,但它不会收缩 QLineEdit,所以它最终添加了一个滚动条。 (滚动区域的背景为蓝色,内容小部件为紫色)
我从设计开始,但滚动区域小部件下方的所有内容都在代码中,因为我无法使用设计使垂直布局正常工作。
这里是起点:
StackWidget 中有一个页面有两个垂直布局的元素。滚动区域有一个 QWidget。 MainWindow 的构造函数定义了一个垂直布局,将其分配给成员 scrollWidgetLayout
,并将该布局提供给滚动区域的小部件:
scrollWidgetLayout = new QVBoxLayout(ui->scrollAreaWidgetContents);
ui->scrollAreaWidgetContents->setLayout(scrollWidgetLayout);
应用程序在堆栈小部件的第一页启动,用户登录,然后应用程序运行以从服务器获取记录。每条记录都变成一个小部件:
RecordFolderWidget::RecordFolderWidget(Record *r, QWidget *parent) : QWidget(parent)
{
record = r;
//setSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding);
QGridLayout *layout = new QGridLayout();
pathLineEdit = new QLineEdit();
finderButton = new QPushButton("...");
QLabel *nameLabel = new QLabel(record->name);
layout->setSpacing(5);
layout->setMargin(3);
layout->addWidget(nameLabel, 0, 0, 0, 1, Qt::AlignCenter);
layout->addWidget(pathLineEdit, 1, 0);
layout->addWidget(finderButton, 1, 1);
setLayout(layout);
//setMinimumHeight(sizeHint().height());
}
请注意,有些行被注释掉了,这些是我一直在尝试让它发挥作用的东西。顺便说一句,sizeHint 似乎是正确的,并且不会改变。
创建小部件后,它会添加到滚动区域的小部件中:
RecordFolderWidget *rf = new RecordFolderWidget(record);
rf->setParent(ui->scrollAreaWidgetContents);
scrollWidgetLayout->addWidget(rf);
我在这里也尝试调整滚动区域内容的大小,但没有成功:
ui->scrollAreaWidgetContents->resize(rfSize.width(), rfSize.height() * records.count());
其中 rfSize 是在创建自定义小部件后从其 sizeHint 中提取的,并且在循环到 create/add 所有小部件之后调用此行一次。
除了上面的 setMinimumHeight 和 resize 之外,我还尝试将 scrollAreaWidgetContents 的 SizePolicy 从 preferred 更改为 expanding 到 minimumexpanding,但没有发现任何区别。我确定我错过了一些微不足道的东西,但就是找不到。
我在你的代码中看到的问题是在添加 QLabel 时你将 rowSpan 设置为 0,我已经更改它并且我可以正确观察它。在下一部分中,我将展示我的测试代码和结果:
QVBoxLayout *scrollWidgetLayout = new QVBoxLayout(ui->scrollAreaWidgetContents);
for(int i=0; i<10; i++){
QWidget *widget = new QWidget;
QGridLayout *layout = new QGridLayout(widget);
QLineEdit *pathLineEdit = new QLineEdit;
QPushButton *finderButton = new QPushButton("...");
QLabel *nameLabel = new QLabel(QString("name %1").arg(i));
layout->setSpacing(5);
layout->setMargin(3);
layout->addWidget(nameLabel, 0, 0, 1, 1, Qt::AlignCenter);
layout->addWidget(pathLineEdit, 1, 0);
layout->addWidget(finderButton, 1, 1);
scrollWidgetLayout->addWidget(widget);
}