如何在 QT 中保持屏幕内容居中并具有滚动条?

问题描述 投票:0回答:1

我开始学习 QT,但我很难保持 QVBoxLayout 居中,同时又让 ScrollArea 保持功能。

我在网上搜索了解决方案,每个人都告诉我 ScrollArea 中应该有一个小部件而不是布局,但是当我这样做时,ScrollArea 开始运行,但 QVBoxLayout 不再停留在窗口的中心。

这是我的 mainwindow.cpp 文件的内容:

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

#include <QMainWindow>
#include <QPushButton>
#include <QApplication>

#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QScrollArea>
#include <QObject>
#include <QLabel>
#include <QLineEdit>

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

    QScrollArea *scrollArea = new QScrollArea();
    QVBoxLayout *innerVerticalLayout = new QVBoxLayout;
    QVBoxLayout *verticalLayout = new QVBoxLayout;
    verticalLayout->setAlignment(Qt::AlignTop);
    QWidget *verticalLayoutWidgetContainer = new QWidget();
    verticalLayoutWidgetContainer->setLayout(verticalLayout);
    verticalLayoutWidgetContainer->setFixedWidth(1000);


    QHBoxLayout *horizontalLayout = new QHBoxLayout;
    horizontalLayout->setAlignment(Qt::AlignTop);
    QPushButton *leftButton = new QPushButton("Left Button");
    leftButton->setFixedWidth(100);
    QPushButton *rightButton = new QPushButton("Right Button");
    rightButton->setFixedWidth(100);
    horizontalLayout->addWidget(leftButton, 0, Qt::AlignLeft);
    horizontalLayout->addWidget(rightButton, 0, Qt::AlignRight);


    QHBoxLayout *horizontalLayout1 = new QHBoxLayout;
    horizontalLayout1->setAlignment(Qt::AlignTop);
    QPushButton *centerButton = new QPushButton("Center Button");
    centerButton->setFixedWidth(100);
    horizontalLayout1->addWidget(centerButton, 0, Qt::AlignHCenter);

    QHBoxLayout *horizontalLayout2 = new QHBoxLayout;
    horizontalLayout2->setAlignment(Qt::AlignTop);
    QPushButton *rightButton1 = new QPushButton("Right Button");
    rightButton1->setFixedWidth(100);
    horizontalLayout2->addWidget(rightButton1, 0, Qt::AlignRight);


    verticalLayout->addLayout(horizontalLayout, 0);
    verticalLayout->addLayout(horizontalLayout1, 0);
    verticalLayout->addLayout(horizontalLayout2, 0);

    innerVerticalLayout->addWidget(verticalLayoutWidgetContainer, 0, Qt::AlignHCenter | Qt::AlignTop);
    scrollArea->setLayout(innerVerticalLayout);
    this->setCentralWidget(scrollArea);  
}

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

编辑:添加链接以显示当我在 ScrollArea 中有布局/小部件时应用程序如何工作以及我希望它如何工作。

链接 1:ScrollArea 如何与其中的布局一起工作。 https://i.imgur.com/oJghW1O.mp4 ScrollArea 不起作用,但布局的行为符合我的预期。它具有固定宽度并位于容器的中心。

链接 2:ScrollArea 在其中包含小部件时的行为方式(我将布局包装在小部件中)。 https://i.imgur.com/nMaVmdi.mp4 ScrollArea 可以工作,但布局不再停留在中心。

我想要的是布局保持在中心并且 ScrollArea 也能工作。

注意第一个视频(ScrollArea 不起作用的地方)是上面代码的结果。

第二个视频是通过将布局包装在一个widget中,然后将其设置为ScrollArea的widget来实现的:

- scrollArea->setLayout(innerVerticalLayout);

+ QWidget *innerVerticalLayoutWidgetContainer = new QWidget();
+ innerVerticalLayoutWidgetContainer->setLayout(innerVerticalLayout);
+ scrollArea->setWidget(innerVerticalLayoutWidgetContainer);

c++ qt
1个回答
0
投票

我想我已经修好了。 我订阅了 MainWindow 的调整大小事件,并在主窗口的宽度变得大于居中布局的宽度时,使最外层布局(包裹在小部件中)的宽度与 MainWindow 的宽度相匹配,如下所示:

void MainWindow::resizeEvent(QResizeEvent* event)
{
    if (this->width() > verticalLayoutWidgetContainer->width())
        innerVerticalLayoutWidgetContainer->setFixedWidth(this->width() - 2);
    QMainWindow::resizeEvent(event);
}

我添加了-2,因为当-2不存在时,ScrollArea的水平条永远不会消失。

© www.soinside.com 2019 - 2024. All rights reserved.