qt QScrollArea 可滚动区域控件简单举例

时间:2024-07-20 15:50:35

1.qt 滚动控件简单举例

在Qt中,滚动控件通常是通过QScrollArea来实现的。以下是一个简单的例子,展示了如何使用QScrollArea来创建一个滚动控件:

#include <QApplication>  
#include <QWidget>  
#include <QVBoxLayout>  
#include <QPushButton>  
#include <QScrollArea>  
  
int main(int argc, char *argv[])  
{  
    QApplication app(argc, argv);  
  
    // 创建一个主窗口部件  
    QWidget *mainWindow = new QWidget;  
    QVBoxLayout *layout = new QVBoxLayout;  
  
    // 创建一个滚动区域  
    QScrollArea *scrollArea = new QScrollArea;  
    QWidget *scrollWidget = new QWidget;  // 创建一个内部部件来放置按钮  
    scrollArea->setWidget(scrollWidget);  // 将内部部件设置为滚动区域的widget  
    scrollArea->setWidgetResizable(true); // 允许滚动区域的widget根据内容调整大小  
    scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 水平滚动条始终关闭  
    scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);  // 垂直滚动条按需显示  
  
    // 创建一个垂直布局来放置按钮,并将其设置为内部部件的布局  
    QVBoxLayout *scrollLayout = new QVBoxLayout(scrollWidget);  
  
    // 添加多个按钮到滚动区域的内部部件中  
    for (int i = 0; i < 20; ++i) {  
        QPushButton *button = new QPushButton(QString("Button %1").arg(i + 1));  
        scrollLayout->addWidget(button);  
    }  
  
    // 将滚动区域添加到主窗口的布局中  
    layout->addWidget(scrollArea);  
    mainWindow->setLayout(layout);  
    mainWindow->show();  
  
    return app.exec();  
}

在这个例子中,我们首先创建了一个QScrollArea对象,并为其设置了一个内部部件(scrollWidget)。然后,我们在内部部件上创建了一个垂直布局(scrollLayout),并向其中添加了20个按钮。最后,我们将滚动区域添加到主窗口的布局中,并显示主窗口。

这个例子展示了如何使用QScrollArea来创建一个简单的滚动控件,其中包含多个按钮。当用户添加足够多的内容以使窗口无法完全显示时,滚动条会自动出现,允许用户滚动查看所有内容。

2.测试过程记录

要点

// 禁止 QScrollArea 自动调整大小以适应内容
    scrollArea->setWidgetResizable(false);

// 设置QLabel的最小大小限制,以确保其可以扩展
    //label->setMinimumSize(400, 800);

期初我在ui中直接拖进去一个控件,比scrollArea大,结果不出现滚动窗口,我用上面的两种情况,或者添加布局,都不出现,最终确认直接拖进去无效,用代码设置的好用,原因目前不确定,这只是一个实验结果。

实验1 

#include <QApplication>
#include <QWidget>
#include <QScrollArea>
#include <QLabel>
#include <QVBoxLayout>

int main2(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget *mainWindow = new QWidget;
    //QVBoxLayout *mainLayout = new QVBoxLayout(mainWindow);

    QScrollArea *scrollArea = new QScrollArea(mainWindow);
    QLabel *label = new QLabel(mainWindow);

    // 设置QLabel的内容,使其足够大以触发滚动条
    label->setText("A very long text that should trigger scrollbars...");
    //label->resize(400,800);

    // 设置QLabel的最小大小限制,以确保其可以扩展
    //label->setMinimumSize(400, 800);

    // 将QLabel添加到QScrollArea中
    scrollArea->setWidget(label);

    // 禁止QScrollArea自动调整大小以适应内容
    scrollArea->setWidgetResizable(false);

    // 将QScrollArea添加到主布局中
    //mainLayout->addWidget(scrollArea);
    scrollArea->resize(300, 300);
    scrollArea->move(50, 50);

    mainWindow->resize(400, 400);
    label->resize(400,800);
    mainWindow->show();
    return app.exec();
}

实验2

#include <QApplication>
#include <QWidget>
#include <QScrollArea>
#include <QLabel>

int main3(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget *mainWindow = new QWidget;
    QScrollArea *scrollArea = new QScrollArea(mainWindow);
    QLabel *label = new QLabel;

    // 设置 QLabel 的内容
    label->setText("A very long text that should trigger scrollbars...");

    // 手动设置 QLabel 的大小,确保内容足够大以触发滚动条
    label->resize(400, 800);

    // 将 QLabel 添加到 QScrollArea 中
    scrollArea->setWidget(label);

    // 禁止 QScrollArea 自动调整大小以适应内容
    scrollArea->setWidgetResizable(false);

    // 手动设置 QScrollArea 的大小和位置
    scrollArea->resize(300, 300);
    scrollArea->move(50, 50);

    mainWindow->resize(400, 400);
    mainWindow->show();

    return app.exec();
}

实验3

#include "test4.h"

#include <QApplication>


int main4(int argc, char *argv[]) {
    QApplication app(argc, argv);
    Test4 t4;
    t4.show();
    return app.exec();
}
#include "test4.h"
#include "ui_test4.h"
#include <QScrollArea>

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

    QScrollArea *scrollArea = new QScrollArea(this);
    label = new QLabel;

    // 将 QLabel 添加到 QScrollArea 中
    scrollArea->setWidget(label);

    // 手动设置 QLabel 的大小,确保内容足够大以触发滚动条
    //label->resize(400, 800);

    // 手动设置 QScrollArea 的大小和位置
    scrollArea->resize(300, 300);
    scrollArea->move(50, 50);
}

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

void Test4::on_pushButton_clicked()
{
    label->resize(400, 800);
}