如何在不添加滚动条的情况下设置QScrollArea(在QDialog中)将扩展到的最大宽度?

时间:2019-04-02 09:37:37

标签: qt qdialog qscrollarea

我里面有QDialogQScrollArea。当QScrollArea中的内容较小时,对话框窗口也较小。当内容宽度增加时,对话框窗口的宽度也会增加,但只能达到某个固定值。

在我的示例中,QPushButton的宽度大约为450或更大时,出现垂直滚动条。如何避免这种情况,并让对话框窗口扩展更多?

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,并为QDialogQScrollArea设置了“扩展尺寸”策略,但没有帮助

1 个答案:

答案 0 :(得分:1)

QScrollArea限制了其sizeHint()方法的最大大小(在我当前的Win7计算机上为468px)。您可以see that here。 (直到现在我都不知道……不确定他们为什么选择这种方式。)

因此,您似乎必须重新实现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()并根据有意义的条件为该对话框设置一个特定的大小。