窗口中要是控件和项目过多会导致显示不完全,拥挤的情况。这个时候需要用到QScrollArea创建滚动条来显示全部内容。
目录
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);
}