QFrame

一、基础作用

  1. QFrame 带边框 背景 阴影的基础容器控件

  2. 核心作用:

给一片区域加边框、分割线、圆角、阴影

二、两大属性

  1. frameShape 边框形状
cpp 复制代码
frame->setFrameShape(QFrame::NoFrame);      // 无边框(默认很多控件)
frame->setFrameShape(QFrame::Box);          // 四周矩形框
frame->setFrameShape(QFrame::HLine);        // 水平分割线
frame->setFrameShape(QFrame::VLine);        // 垂直分割线
frame->setFrameShape(QFrame::Panel);        // 凹陷面板
frame->setFrameShape(QFrame::StyledPanel);  // 配合样式表最常用
  1. frameShadow 阴影凹凸效果
cpp 复制代码
frame->setFrameShadow(QFrame::Plain);    // 平面无凹凸
frame->setFrameShadow(QFrame::Raised);    // 凸起
frame->setFrameShadow(QFrame::Sunken);    // 凹陷
  1. 边框宽度
cpp 复制代码
frame->setLineWidth(2);    // 主线宽度
frame->setMidLineWidth(1); // 中间分隔线宽度(Panel/Box生效)
  1. 用 QFrame 做分割线
cpp 复制代码
// 水平分割线
QFrame *hLine = new QFrame;
hLine->setFrameShape(QFrame::HLine);
hLine->setFrameShadow(QFrame::Sunken);

// 垂直分割线
QFrame *vLine = new QFrame;
vLine->setFrameShape(QFrame::VLine);
  1. 样式表美化
cpp 复制代码
// 圆角灰色边框面板
frame->setStyleSheet(R"(
QFrame{
    border:1px solid #cccccc;
    border-radius:6px;
    background-color:#f8f8f8;
}
)");

三、示例代码

cpp 复制代码
MainWidget::MainWidget(QWidget *parent) : QWidget(parent)
{
    QSplitter *splitter = new QSplitter(Qt::Horizontal, this);
    splitter->setHandleWidth(4);
    splitter->setCollapsible(0, false);

    // 左侧列表外层套QFrame分组
    QFrame *leftFrame = new QFrame;
    leftFrame->setFrameShape(QFrame::StyledPanel);
    leftFrame->setStyleSheet("border:1px solid #ddd; border-radius:4px;");
    QVBoxLayout *leftLay = new QVBoxLayout(leftFrame);
    leftLay->setContentsMargins(2,2,2,2);

    list = new QListWidget;
    leftLay->addWidget(list);

    // 右侧内容区也可套Frame
    QFrame *rightFrame = new QFrame;
    rightFrame->setFrameShape(QFrame::StyledPanel);
    QVBoxLayout *rightLay = new QVBoxLayout(rightFrame);
    content = new Content;
    rightLay->addWidget(content);

    splitter->addWidget(leftFrame);
    splitter->addWidget(rightFrame);
    splitter->setStretchFactor(0,1);
    splitter->setStretchFactor(1,3);

    // 主布局
    QHBoxLayout *mainLay = new QHBoxLayout(this);
    mainLay->setContentsMargins(0,0,0,0);
    mainLay->addWidget(splitter);
}