如何在不添加滚动条的情况下设置 QScrollArea(在 QDialog 内)扩展的最大宽度?
How can I set maximum width to which QScrollArea (within QDialog) will expand without adding scrollbar?
我里面有QDialog
和QScrollArea
。当 QScrollArea
中的内容较小时,对话框 window 也较小。当内容宽度增加时,对话框 window 的宽度也会增加,但只会增加到某个固定值。
当QPushButton
的宽度在我的例子中大约为450或更多时,出现垂直滚动条。我怎样才能避免这种情况并让对话框 window 扩展得更多?
class Dialog : public QDialog {
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr) : QDialog(parent) {
auto dialogLayout = new QVBoxLayout(this);
auto scrollArea = new QScrollArea(this);
scrollArea->setWidgetResizable(true);
auto scrollWidget = new QWidget(scrollArea);
auto scrollLayout = new QVBoxLayout(scrollWidget);
scrollLayout->setAlignment(Qt::AlignTop);
scrollArea->setWidget(scrollWidget);
dialogLayout->addWidget(scrollArea);
auto button = new QPushButton("Button", this);
button->setFixedSize(500, 30);
scrollLayout->addWidget(button);
}
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
{
auto centralWidget = new QWidget(this);
setCentralWidget(centralWidget);
auto mainLayout = new QVBoxLayout(centralWidget);
auto button = new QPushButton("Dialog", this);
mainLayout->addWidget(button);
connect(button, &QPushButton::clicked, this, []() {Dialog().exec();});
}
};
我尝试了 QDialog::setMaximumWidth
,并为 QDialog
和 QScrollArea
设置了扩展尺寸政策,但没有任何帮助
QScrollArea 限制了其 sizeHint()
方法的最大大小(在我当前的 Win7 机器上为 468px)。你可以see that here。 (直到现在我也不知道这一点......不知道他们为什么选择这样做。)
看来您必须重新实施 QScrollArea
或寻找不同的显示策略。要重新实现,我们基本上只需要重新编写 sizeHint()
函数,但 w/out 愚蠢的约束。
#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()
并根据任何有意义的标准为那里的对话框设置特定大小。
我里面有QDialog
和QScrollArea
。当 QScrollArea
中的内容较小时,对话框 window 也较小。当内容宽度增加时,对话框 window 的宽度也会增加,但只会增加到某个固定值。
当QPushButton
的宽度在我的例子中大约为450或更多时,出现垂直滚动条。我怎样才能避免这种情况并让对话框 window 扩展得更多?
class Dialog : public QDialog {
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr) : QDialog(parent) {
auto dialogLayout = new QVBoxLayout(this);
auto scrollArea = new QScrollArea(this);
scrollArea->setWidgetResizable(true);
auto scrollWidget = new QWidget(scrollArea);
auto scrollLayout = new QVBoxLayout(scrollWidget);
scrollLayout->setAlignment(Qt::AlignTop);
scrollArea->setWidget(scrollWidget);
dialogLayout->addWidget(scrollArea);
auto button = new QPushButton("Button", this);
button->setFixedSize(500, 30);
scrollLayout->addWidget(button);
}
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
{
auto centralWidget = new QWidget(this);
setCentralWidget(centralWidget);
auto mainLayout = new QVBoxLayout(centralWidget);
auto button = new QPushButton("Dialog", this);
mainLayout->addWidget(button);
connect(button, &QPushButton::clicked, this, []() {Dialog().exec();});
}
};
我尝试了 QDialog::setMaximumWidth
,并为 QDialog
和 QScrollArea
设置了扩展尺寸政策,但没有任何帮助
QScrollArea 限制了其 sizeHint()
方法的最大大小(在我当前的 Win7 机器上为 468px)。你可以see that here。 (直到现在我也不知道这一点......不知道他们为什么选择这样做。)
看来您必须重新实施 QScrollArea
或寻找不同的显示策略。要重新实现,我们基本上只需要重新编写 sizeHint()
函数,但 w/out 愚蠢的约束。
#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()
并根据任何有意义的标准为那里的对话框设置特定大小。