我开始学习 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);
我想我已经修好了。 我订阅了 MainWindow 的调整大小事件,并在主窗口的宽度变得大于居中布局的宽度时,使最外层布局(包裹在小部件中)的宽度与 MainWindow 的宽度相匹配,如下所示:
void MainWindow::resizeEvent(QResizeEvent* event)
{
if (this->width() > verticalLayoutWidgetContainer->width())
innerVerticalLayoutWidgetContainer->setFixedWidth(this->width() - 2);
QMainWindow::resizeEvent(event);
}
我添加了-2,因为当-2不存在时,ScrollArea的水平条永远不会消失。