Как установить максимальную ширину, до которой будет расширяться QScrollArea (в пределах QDialog) без добавления полосы прокрутки? - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть QDialog и QScrollArea внутри. Когда содержимое в 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 и установил политику расширения размера для QDialog и QScrollArea, но ничего не помогает

1 Ответ

1 голос
/ 05 апреля 2019

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() и установить там определенный размер для диалога, основываясь на любых критериях, которые имеют смысл.

...