本页内容

QSplitter Class

QSplitter 类实现了一个拆分控件。更多内容...

头文件: #include <QSplitter>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
继承自: QFrame

属性

公共函数

QSplitter(QWidget *parent = nullptr)
QSplitter(Qt::Orientation orientation, QWidget *parent = nullptr)
virtual ~QSplitter()
void addWidget(QWidget *widget)
bool childrenCollapsible() const
int count() const
void getRange(int index, int *min, int *max) const
QSplitterHandle *handle(int index) const
int handleWidth() const
int indexOf(QWidget *widget) const
void insertWidget(int index, QWidget *widget)
bool isCollapsible(int index) const
bool opaqueResize() const
Qt::Orientation orientation() const
void refresh()
QWidget *replaceWidget(int index, QWidget *widget)
bool restoreState(const QByteArray &state)
QByteArray saveState() const
void setChildrenCollapsible(bool)
void setCollapsible(int index, bool collapse)
void setHandleWidth(int)
void setOpaqueResize(bool opaque = true)
void setOrientation(Qt::Orientation)
void setSizes(const QList<int> &list)
void setStretchFactor(int index, int stretch)
QList<int> sizes() const
QWidget *widget(int index) const

重新实现的公共函数

virtual QSize minimumSizeHint() const override
virtual QSize sizeHint() const override

信号

void splitterMoved(int pos, int index)

受保护函数

int closestLegalPosition(int pos, int index)
virtual QSplitterHandle *createHandle()
void moveSplitter(int pos, int index)
void setRubberBand(int pos)

重新实现的受保护函数

virtual void changeEvent(QEvent *ev) override
virtual void childEvent(QChildEvent *c) override
virtual bool event(QEvent *e) override
virtual void resizeEvent(QResizeEvent *) override

详细说明

拆分器允许用户通过拖动子控件之间的边界来控制子控件的大小。一个拆分器可以控制任意数量的控件。QSplitter 的典型用法是创建多个控件,并使用insertWidget() 或addWidget() 将其添加进来。

以下示例将并排展示QListView 、QTreeView 和QTextEdit ,并包含两个分割器控点:

QSplitter *splitter = new QSplitter(parent);
QListView *listview = new QListView;
QTreeView *treeview = new QTreeView;
QTextEdit *textedit = new QTextEdit;
splitter->addWidget(listview);
splitter->addWidget(treeview);
splitter->addWidget(textedit);

如果在调用insertWidget() 或addWidget() 时,QSplitter 中已经存在小部件,该小部件将移动到新位置。这可用于在后续操作中重新排列分隔器内的小部件顺序。您可以使用indexOf()、widget() 和count() 来访问分隔器内的小部件。

默认情况下,QSplitter 会将子控件水平排列(并排);您可以使用setOrientation(Qt::Vertical) 将其子控件垂直排列。

默认情况下,所有小部件的大小均可由用户自由调整,范围在该小部件的minimumSizeHint() (或minimumSize()) 与maximumSize() 之间。

默认情况下,QSplitter 会动态调整其子控件的大小。若希望 QSplitter 仅在调整大小操作结束时才调整子控件的大小,请调用setOpaqueResize(false)。

小部件之间的初始尺寸分配是通过将初始尺寸乘以拉伸因子来确定的。您也可以使用setSizes() 来设置所有小部件的尺寸。函数sizes() 返回用户设置的尺寸。此外,您还可以分别使用saveState() 和restoreState() 从QByteArray 中保存和恢复小部件的尺寸。

当您对某个子控件调用 `hide()` 时,其占用的空间将分配给其他子控件。当您再次对其调用 `show()` 时,该子控件将恢复原有空间。

注意: 不支持向 QSplitter添加 QLayout (无论是通过setLayout() 方法,还是将 QSplitter 设为QLayout 的父控件);请改用addWidget()(参见上文示例)。

安全性注意事项

restoreState() 函数会反序列化一个带版本的二进制数据块,该数据块描述了分隔器子元素的大小和方向。虽然会验证该格式的魔数和版本,但一旦接受了外部结构,就不会对各个字段进行进一步的合理性检查。

仅应向 `restoreState()` 传递由 `saveState()` 先前生成,并由您应用程序的同一版本(或兼容版本)通过 `QSettings` 保存的 `QByteArray `。切勿使用来源未知或不可信的数据(例如从网络下载的文件、同步或共享的配置文件,或由其他可能已遭入侵的应用程序提供的数据)调用 `restoreState()`。

另请参阅 QSplitterHandle 、QHBoxLayout 、QVBoxLayout 以及QTabWidget 。

属性文档

childrenCollapsible : bool

该属性控制子控件是否允许用户将其调整为大小为 0

默认情况下,子控件可折叠。可以通过调用setCollapsible()来启用或禁用单个子控件的折叠功能。

访问函数:

bool childrenCollapsible() const
void setChildrenCollapsible(bool)

另请参阅 setCollapsible()。

handleWidth : int

该属性存储分隔符控点的宽度

默认情况下,该属性的值取决于用户的平台和样式偏好。

如果将 handleWidth 设置为 1 或 0,实际的拖拽区域会扩展,从而与相应的控件重叠几像素。

访问函数:

int handleWidth() const
void setHandleWidth(int)

opaqueResize : bool

如果在交互式移动分隔线时,小部件被动态(不透明地)调整大小,则返回true ;否则返回false 。

默认的调整大小行为取决于样式(由 SH_Splitter_OpaqueResize 样式提示决定)。不过,您可以通过调用 setOpaqueResize() 来覆盖该行为

访问函数:

bool opaqueResize() const
void setOpaqueResize(bool opaque = true)

另请参阅 QStyle::StyleHint 。

orientation : Qt::Orientation

该属性用于设置分隔器的方向

默认情况下,其方向为水平(即控件并排布局)。可选方向包括Qt::Horizontal 和Qt::Vertical 。

访问函数:

Qt::Orientation orientation() const
void setOrientation(Qt::Orientation)

另请参阅 QSplitterHandle::orientation()。

成员函数文档

[explicit] QSplitter::QSplitter(QWidget *parent = nullptr)

构建一个水平分隔符,并将parent 参数传递给QFrame 构造函数。

另请参阅 setOrientation()。

[explicit] QSplitter::QSplitter(Qt::Orientation orientation, QWidget *parent = nullptr)

根据给定的orientation 和parent 构建一个分隔符。

另请参阅 setOrientation()。

[virtual noexcept] QSplitter::~QSplitter()

销毁拆分器。所有子节点均被删除。

void QSplitter::addWidget(QWidget *widget)

将给定的widget 添加到拆分器的布局中,位于所有其他项之后。

如果widget 已存在于分隔器中,它将被移动到新位置。

注意:拆分器 将拥有该小部件的所有权。

另请参阅 insertWidget()、widget() 和indexOf()。

[override virtual protected] void QSplitter::changeEvent(QEvent *ev)

重写了:QFrame::changeEvent(QEvent *ev)。

[override virtual protected] void QSplitter::childEvent(QChildEvent *c)

重写:QObject::childEvent(QChildEvent *event)。

告知拆分器,c 所描述的子控件已被插入或移除。

此方法还用于处理以下情况:某个控件以拆分器为父控件创建,但未通过insertWidget() 或addWidget() 显式添加。此做法是为了兼容性,并非在新代码中将控件放入拆分器的推荐方式。请在新代码中使用insertWidget() 或addWidget()。

另请参阅 addWidget() 和insertWidget()。

[protected] int QSplitter::closestLegalPosition(int pos, int index)

返回位于index 的控件中,距离pos 最近且符合规范的位置。

对于阿拉伯语和希伯来语等从右向左书写的语言,水平分隔线的布局会反转。此时,位置将从控件的右边缘开始测量。

另请参阅 getRange()。

int QSplitter::count() const

返回拆分器布局中包含的小部件数量。

另请参阅 widget() 和handle()。

[virtual protected] QSplitterHandle *QSplitter::createHandle()

返回一个新的拆分器手柄,作为该拆分器的子控件。子类可以重写此函数,以支持自定义手柄。

另请参阅 handle() 和indexOf()。

[override virtual protected] bool QSplitter::event(QEvent *e)

重写了:QFrame::event(QEvent *e)。

void QSplitter::getRange(int index, int *min, int *max) const

当min 和max 不为 0 时,返回 *min 和 *max 中index 处的分隔符的有效范围。

QSplitterHandle *QSplitter::handle(int index) const

返回在分隔线布局中位于给定index 处项目左侧(或上方)的控件句柄;若不存在该项目,则返回nullptr 。索引为0的控件句柄始终处于隐藏状态。

对于阿拉伯语和希伯来语等从右向左书写的语言,水平分隔器的布局会被反转。此时,在index 位置,控件右侧将显示该控件。

另请参阅 count()、widget()、indexOf()、createHandle() 以及setHandleWidth()。

int QSplitter::indexOf(QWidget *widget) const

返回指定widget 在拆分器布局中的索引,若未找到widget ,则返回-1。此方法也适用于句柄。

句柄的编号从 0 开始。句柄的数量与子控件的数量相同,但位于第 0 位的句柄始终处于隐藏状态。

另请参阅 count() 和widget()。

void QSplitter::insertWidget(int index, QWidget *widget)

将指定的widget 插入到分隔器的布局中,位置为index 。

如果widget 已存在于分隔器中,则将其移动到新位置。

如果index 是一个无效索引,则该小部件将被插入到末尾。

注意: 分隔符将拥有该小部件的所有权。

另请参阅 addWidget()、indexOf() 和widget()。

bool QSplitter::isCollapsible(int index) const

如果位于index 的控件可折叠,则返回true ;否则返回false 。

[override virtual] QSize QSplitter::minimumSizeHint() const

重新实现了属性QWidget::minimumSizeHint 的访问函数。

[protected] void QSplitter::moveSplitter(int pos, int index)

将位于index 的分隔符手柄的左边缘或顶边缘尽可能靠近位置pos ,该位置即距控件左边缘或顶边缘的距离。

对于阿拉伯语和希伯来语等从右向左书写的语言,水平分割线的布局会被反转。此时,pos 即为距控件右边缘的距离。

另请参阅 splitterMoved()、closestLegalPosition() 和getRange()。

void QSplitter::refresh()

更新拆分器的状态。您通常无需调用此函数。

QWidget *QSplitter::replaceWidget(int index, QWidget *widget)

将分割器布局中位于指定index 处的小部件替换为widget 。

如果index 有效,且widget 尚未是拆分器的子组件,则返回刚刚被替换的小部件。否则,返回 null,且不会进行任何替换或添加操作。

新插入小部件的几何属性将与被替换的小部件相同。其可见状态和折叠状态也会被继承。

注意: 拆分器 将拥有widget ,并将被替换小部件的父级设置为 null。

注意:由于 widget 通过reparented 被引入分隔器,其geometry 属性可能不会立即设置,而需等到widget 能接收相应事件后才会设置。

另请参阅 insertWidget() 和indexOf()。

[override virtual protected] void QSplitter::resizeEvent(QResizeEvent *)

重写了:QWidget::resizeEvent(QResizeEvent *event)。

bool QSplitter::restoreState(const QByteArray &state)

将拆分器的布局恢复为指定的state 。如果状态已恢复,则返回true ;否则返回false 。

通常,此方法与QSettings 配合使用,以从过去的会话中恢复大小。以下是一个示例:

恢复拆分器的状态:

QSettings settings;
splitter->restoreState(settings.value("splitterSizes").toByteArray());

若无法恢复拆分器的布局,可能是由于提供的字节数组中的数据无效或已过时所致。

另请参阅 saveState()。

QByteArray QSplitter::saveState() const

保存拆分器布局的状态。

通常,此功能会与 `QSettings ` 配合使用,以便在下次会话中记住该大小。数据中会存储一个版本号。以下是一个示例:

QSettings settings;
settings.setValue("splitterSizes", splitter->saveState());

另请参阅 restoreState()。

void QSplitter::setCollapsible(int index, bool collapse)

将位于index 的子控件是否可折叠的属性设置为collapse 。

默认情况下,子控件是可折叠的,这意味着即使它们的minimumSize()或minimumSizeHint()返回值不为零,用户仍可将其调整为大小为0。可以通过调用此函数针对每个控件单独更改此行为,或者通过设置childrenCollapsible 属性对拆分器中的所有控件进行全局设置。

另请参阅 isCollapsible() 和childrenCollapsible 。

[protected] void QSplitter::setRubberBand(int pos)

在坐标pos 处显示一条橡皮筋。如果pos 为负数,则移除该橡皮筋。

void QSplitter::setSizes(const QList<int> &list)

将子控件的各自尺寸设置为list 中指定的值。

如果分割线为水平方向,这些值将从左到右依次设置每个控件的宽度(以像素为单位);如果分割线为垂直方向,则从上到下依次设置每个控件的高度。

list 中的额外值将被忽略。如果list 中的值过少,结果将未定义,但程序仍会正常运行。

分隔器控件的整体尺寸不受影响。相反,任何多余或缺失的空间将根据尺寸的相对权重在控件之间进行分配。

若指定大小为 0,控件将不可见。控件的大小策略将得到保留。也就是说,小于相应控件最小大小提示的值将被提示值所替换。

另请参阅 sizes()。

void QSplitter::setStretchFactor(int index, int stretch)

更新位于位置index 的控件的大小策略,使其拉伸系数为stretch 。

stretch 并非实际拉伸因子;实际拉伸因子是通过将控件的初始大小乘以stretch 计算得出的。

提供此函数仅为方便起见。它等同于

QWidget *widget = splitter->widget(index);
QSizePolicy policy = widget->sizePolicy();
policy.setHorizontalStretch(stretch);
policy.setVerticalStretch(stretch);
widget->setSizePolicy(policy);

另请参阅 setSizes() 和widget()。

[override virtual] QSize QSplitter::sizeHint() const

重新实现了:QFrame::sizeHint() const。

QList<int> QSplitter::sizes() const

返回此拆分器中所有控件的大小参数列表。

如果拆分器的方向为水平,则该列表包含各控件的宽度(以像素为单位),从左到右排列;如果方向为垂直,则该列表包含各控件的高度(以像素为单位),从上到下排列。

将这些值传递给另一个拆分器的setSizes()函数,将生成一个与该拆分器布局相同的拆分器。

请注意,不可见小部件的大小为 0。

另请参阅 setSizes()。

[signal] void QSplitter::splitterMoved(int pos, int index)

当位于特定坐标index 的分割线控点被移动到位置pos 时,会发出此信号。

对于阿拉伯语和希伯来语等从右向左书写的语言,水平分隔线的布局会发生逆转。此时,pos 表示距控件右边缘的距离。

另请参阅 moveSplitter()。

QWidget *QSplitter::widget(int index) const

返回拆分器布局中位于给定index 处的小部件,如果不存在该小部件,则返回nullptr 。

另请参阅 count()、handle()、indexOf(),以及insertWidget()。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.