Горизонтальное разбиение QMdiArea на дочерние окна, содержащие QScrollArea

#c #qt #qmdiarea

#c #qт #qmdiarea #qt

Вопрос:

Следующий фрагмент кода (mainwindow.cpp ) — это упрощенная версия моей проблемы. Я попытался расположить вложенные окна QMdiArea горизонтально, но почему-то вложенные окна отображаются не полностью — горизонтальные полосы прокрутки внизу этих вложенных окон отображаются неправильно. Мне кажется, что проблема заключается в коде настройки высоты — если я увеличу главное окно (не помещая код разбиения на листы в событие изменения размера), вспомогательные окна отобразятся нормально. Так что я предполагаю, что решением было бы определить правильную высоту. Но как?

 #include "mainwindow.h"
#include "ui_mainwindow.h"

// CODE added to the generated =========================================
#include <QMdiArea>
#include <QDebug>
#include <QGridLayout>
#include <QScrollArea>
#include <QScrollBar>
#include <QLabel>
#include <QString>
#include <QMdiSubWindow>
// CODE END=========================================

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // CODE added to the generated =========================================
    QMdiArea *mdiArea = new QMdiArea;
    this->setCentralWidget(mdiArea);

    QLabel *lable1 = new     QLabel(QString("01234567890123456789012345678901234567890123456789012345678901234567890123456789    01234567890123456789012345678901234567890123456789012345678901234567890123456789"));
    QScrollArea *scrollArea1 = new QScrollArea;
    scrollArea1->setWidget(lable1);
    QGridLayout *grid1 = new QGridLayout;
    grid1->addWidget(scrollArea1);
    QWidget *widget1 = new QWidget;
    widget1->setLayout(grid1);
    mdiArea->addSubWindow(widget1, Qt::FramelessWindowHint);


    QLabel *lable2 = new     QLabel(QString("01234567890123456789012345678901234567890123456789012345678901234567890123456789    01234567890123456789012345678901234567890123456789012345678901234567890123456789"));
    QScrollArea *scrollArea2 = new QScrollArea;
    scrollArea2->setWidget(lable2);
    QGridLayout *grid2 = new QGridLayout;
    grid2->addWidget(scrollArea2);
    QWidget *widget2 = new QWidget;
    widget2->setLayout(grid2);
    mdiArea->addSubWindow(widget2, Qt::FramelessWindowHint);

    // horizontally tile the above widget1amp;2
    int subWidth = this->width() / mdiArea->subWindowList().count();
    int x = 0;
    for(auto sub : mdiArea->subWindowList()) {
        sub->resize(subWidth, height()); // what kind of height could let the whole sub windows including horizontal scrollbars show?
        sub->move(x, 0);
        x  = subWidth;
    }
    // CODE END=========================================
}

MainWindow::~MainWindow()
{
    delete ui;
}
  

Заранее благодарю.

Ответ №1:

На случай, если кто-то столкнется с этим: QMdiArea::tileSubWindows() делает свое дело.

 mdiArea->tileSubWindows();