Как правильно использовать QLayouts (hbox, vbox и т. Д.)? - PullRequest
0 голосов
/ 25 сентября 2018

Я создаю собственный виджет на основе QGraphicsWidget

Внутри виджета мне нужны различные другие виджеты в соответствии с размером окна.Для этого я использую

Layout = new QGraphicsLinearLayout();
Layout->setOrientation(Qt::Horizontal);
setLayout(Layout);

Так что у меня есть макет, и на каждой стороне макета у меня есть виджет.Таким образом, виджет слева и виджет справа.

 QGraphicsLinearLayout() below

      500 px wide x
|--------------------------------| 
|                                |
|left widget         right widget|   100 px tall y
|--------------------------------|

Я хочу, чтобы при увеличении размера окна виджеты оставались в пределах x пикселей от края.Таким образом, если размер окна будет изменен до 10000 пикселей в ширину, левый виджет всегда будет на 1 пиксель от левого края, а правый виджет всегда будет на 1 пиксель от правого края.

                10000 px wide x
|---------------------------------------------------| 
|                                                   |
|left widget                            right widget|   100 px tall y
|---------------------------------------------------|

Текущее поведениеэтот левый виджет останется на месте и никогда не будет двигаться, а правый виджет отойдет от правого края.

Чтобы добиться такого поведения, я попробовал следующее:

Layout->setAlignment(leftWidget, Qt::AlignLeft);

Этоабсолютно ничего.

Я также пытался

Layout->addItem(leftWidget);

Layout->setStretchFactor(leftWidget, 0);

Layout->addItem(rightWidget);

, который дает желаемый эффект, но перекрывает правый виджет с рамкой, например,

      500 px wide x
|--------------------------------| 
|                                |
|left widget                 right widget   100 px tall y
|--------------------------------|

Так, как я могу получить мойжелаемое поведение?QLayouts кажутся очень запутанными, а API вводит в заблуждение.

1 Ответ

0 голосов
/ 25 сентября 2018

Решение

Используйте QGraphicsLinearLayout :: addStretch между левым и правым виджетами, чтобы держать их по бокам, и QGraphicsLayout :: setContentsMargins , чтобы добавить пробелмежду виджетами и краями:

auto *l = new QGraphicsLinearLayout();

l->addItem(leftProxy);
l->addStretch();
l->addItem(rightProxy);
l->setContentsMargins(25, 1, 1, 1);
l->setSpacing(1);

Пример

Я подготовил для вас минимальный пример использования предложенного решения:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    auto *view = new QGraphicsView(this);
    auto *widget = new QWidget();
    auto *leftWidget = new QPushButton(tr("Left"));
    auto *rightWidget = new QPushButton(tr("Right"));
    auto *leftProxy = new QGraphicsProxyWidget();
    auto *rightProxy = new QGraphicsProxyWidget();
    auto *l = new QGraphicsLinearLayout();
    auto *sizeGrip = new QSizeGrip(widget);

    leftWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);
    rightWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);

    widget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);

    widget->setMinimumSize(sizeGrip->sizeHint().width()
                           + leftWidget->sizeHint().width()
                           + rightWidget->sizeHint().width(),
                           leftWidget->sizeHint().height());

    leftProxy->setWidget(leftWidget);
    rightProxy->setWidget(rightWidget);

    l->addItem(leftProxy);
    l->addStretch();
    l->addItem(rightProxy);
    l->setContentsMargins(25, 1, 1, 1);
    l->setSpacing(1);

    view->setScene(new QGraphicsScene(this));
    view->scene()->addWidget(widget)->setLayout(l);

    widget->resize(400, 200);

    setCentralWidget(view);
    resize(640, 480);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...