QScrollArea ограничивает максимальный размер метода sizeHint()
(на моем текущем компьютере с Win7 получается 468 пикселей).Вы можете увидеть это здесь .(Я не знал этого до сих пор ... не уверен, почему они решили сделать это таким образом.)
Похоже, вам придется заново внедрить QScrollArea
или найти другой дисплейстратегия.Для повторной реализации нам просто нужно переписать функцию sizeHint()
, но без глупого ограничения.
#include <QApplication>
#include <QtWidgets>
class ScrollArea : public QScrollArea
{
public:
ScrollArea(QWidget *parent = nullptr) : QScrollArea(parent) {}
QSize sizeHint() const
{
QSize sz = QScrollArea::viewportSizeHint();
const int f = frameWidth() * 2;
sz += QSize(f, f);
if (verticalScrollBarPolicy() == Qt::ScrollBarAlwaysOn)
sz.setWidth(sz.width() + verticalScrollBar()->sizeHint().width());
if (horizontalScrollBarPolicy() == Qt::ScrollBarAlwaysOn)
sz.setHeight(sz.height() + horizontalScrollBar()->sizeHint().height());
return sz;
}
};
class Dialog : public QDialog {
public:
Dialog(QWidget *parent = nullptr) : QDialog(parent) {
auto dialogLayout = new QVBoxLayout(this);
auto scrollArea = new ScrollArea(this);
//scrollArea->setWidgetResizable(true);
auto scrollWidget = new QWidget(this);
auto scrollLayout = new QVBoxLayout(scrollWidget);
auto button = new QPushButton("Button", this);
button->setFixedSize(600, 30);
scrollLayout->addWidget(button);
scrollArea->setWidget(scrollWidget);
dialogLayout->addWidget(scrollArea);
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
return Dialog().exec();
}
Если немного добавить, если вы добавляете элементы в область прокрутки вВ порядке, который я здесь показываю, вам технически не нужен бит setWidgetResizable(true)
, который я закомментировал (я заметил, что в исходном порядке, в котором он был у вас, внутренний виджет не показывался надлежащего размера).
ДОБАВЛЕНО: Причина, по которой sizeHint()
имеет значение, заключается в том, что именно это QDialog
использует для определения своего начального размера.Можно также (например) повторно внедрить QDialog::showEvent()
и установить там определенный размер для диалога, основываясь на любых критериях, которые имеют смысл.