QScrollArea使用案例

窗口中要是控件和项目过多会导致显示不完全,拥挤的情况。这个时候需要用到QScrollArea创建滚动条来显示全部内容。

目录

1.概念

2.效果对比

前:

后:

3.使用步骤

3.1创建滚动区域

3.2创建滚动区域中的小部件

3.3给滚动区域设置部件

3.4使用addWidget往小部件的布局中添加控件

3.5给需要设置滚动条的总窗口添加滚动区域

3.6最后给总窗口设置布局

4.代码中的应用


1.概念

QScrollArea 是 Qt 框架中的一个类,用于提供一个可滚动的视图区域,允许用户在视图内容大于可见区域时进行滚动浏览。具体来说,它是一个容器部件,可以包含一个单独的小部件(称为视口小部件),并且在内容大小超过视口大小时自动提供滚动条。

在 Qt 中,QScrollArea 类位于 Qt Widgets 模块中,通常用于显示大量信息或需要滚动查看的内容,比如文本、图像、表格等。

2.效果对比

前:

后:

3.使用步骤

3.1创建滚动区域

// 创建一个滚动区域
    QScrollArea* scrollArea = new QScrollArea(this);

3.2创建滚动区域中的小部件

// 创建一个新的QWidget作为滚动区域的小部件窗口
    QWidget* scrollWidget = new QWidget();  
//给此小部件创建一个新的布局,之后添加的所有控件都是在此布局中添加,也就是添加到这个小部件窗口中了。
    QGridLayout* scrollLayOut = new QGridLayout(scrollWidget);   
//设置小部件窗口背景颜色
    scrollWidget->setStyleSheet("background-color:white;");

3.3给滚动区域设置部件

scrollArea->setWidget(scrollWidget);    // 设置QWidget为滚动区域的小部件
//必须!~,否则不会自适应大小
scrollArea->setWidgetResizable(true);   // 允许滚动区域的小部件根据内容调整大小

3.4使用addWidget往小部件的布局中添加控件

scrollLayOut->addWidget(widget->frame(), i, 0);

3.5给需要设置滚动条的总窗口添加滚动区域

//给总布局添加滚动区域
 layout->addWidget(scrollArea); 

3.6最后给总窗口设置布局

//为总界面设置布局
    ui->YF_frm_set->setLayout(layout);

总的来说就是,每个窗口都有其布局,往布局中使用addWidget添加控件就是给该窗口添加控件。

滚动区域其实也是一个窗口所以使用addWidget的方式将其添加到总布局中。

特殊的一点是,往滚动区域设置小部件的时候使用的是setWidget。

4.代码中的应用

整体框架:主打一个uidesigner和手动代码结合的形式

ui中只有一个frame主窗口

代码编写

YF_set::YF_set(QWidget* parent)
    :ui(new Ui::setForm())
{
    ui->setupUi(this);
    

    //获取不同的窗口类别,我的类别有两个
    SlaveType type =  YF_Config::GetInstance()->YF_get_Slave_type();

    //窗口整体的布局,总布局
    layout = new QGridLayout(ui->YF_frm_set);
    //layout->setAlignment(Qt::AlignTop);

    // 创建一个滚动区域
    QScrollArea* scrollArea = new QScrollArea(this);
    // 创建一个新的QWidget作为滚动区域的小部件
    QWidget* scrollWidget = new QWidget();  
    QGridLayout* scrollLayOut = new QGridLayout(scrollWidget);   //给此小部件创建一个新的布局
    scrollWidget->setStyleSheet("background-color:white;");
    scrollArea->setWidget(scrollWidget);    // 设置QWidget为滚动区域的小部件
    scrollArea->setWidgetResizable(true);   // 允许滚动区域的小部件根据内容调整大小
    
    
    


//根据不同类别添加不同控件
    switch (type)
    {
    case HTEM:
        for (int i = 0; i < HTEM_PARAM.count(); i++)
        {
            BSCustWidget* widget = nullptr;
            
            if (i < 2)
            {
                widget = new DSLaCustWidget();
                ((DSLaCustWidget*)widget)->setLabelContext("XXXX-XXXX-XXXX-XXXX");
            }
            else if (i==2)
            {
                widget = new DSCboCustWidget();
                ((DSCboCustWidget*)widget)->setCboText(g_baudrate);      
            }
            else
            {
                /*widget = new DSLeCustWidget();*/
                widget = new DSSbCustWidget();
            }
            widget->setLabelText(HTEM_PARAM[i]);     
            scrollLayOut->addWidget(widget->frame(), i, 0);
           
            m_widgets.append(widget);
        }
        break;
    case BMU:
        for (int i = 0; i < BMU_PARAM.count(); i++)
        {
            BSCustWidget* widget = nullptr;

            if (i < 2)
            {
                widget = new DSLaCustWidget();
                ((DSLaCustWidget*)widget)->setLabelContext("XXXX-XXXX-XXXX-XXXX");
            }
            else if (i == 2)
            {
                widget = new DSCboCustWidget();
                ((DSCboCustWidget*)widget)->setCboText(g_baudrate);
            }
            else if(i>=3&&i<=11)
            {
                
                widget = new DSSbCustWidget();
            }
            else
            {
                widget = new DSLeCustWidget();

            }
            widget->setLabelText(BMU_PARAM[i]);
            
            scrollLayOut->addWidget(widget->frame(), i, 0);
            m_widgets.append(widget);
        }

        break;
    default:
        break;
    }

    //给总布局添加滚动区域
    layout->addWidget(scrollArea); 
   //为总界面设置布局
    ui->YF_frm_set->setLayout(layout);
}

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值