QSplitter Class
QSplitter 类实现了一个分割器部件。更多
Header: | #include <QSplitter> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
qmake: | QT += widgets |
继承: | QFrame |
属性
- childrenCollapsible : bool
- handleWidth : int
- opaqueResize : bool
- orientation : Qt::Orientation
公共函数
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 中部件的尺寸。
另请参阅 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)
使用传递给QFrame 构造函数的parent 参数构造水平分割器。
另请参见 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)
返回最接近pos 的 widget 的合法位置index 。
对于阿拉伯语和希伯来语等从右到左的语言,水平分割器的布局是相反的。因此,位置是从 widget 的右边缘开始测量的。
另请参阅 getRange() 。
int QSplitter::count() const
返回分割器布局中包含的部件数量。
[virtual protected]
QSplitterHandle *QSplitter::createHandle()
返回一个新的分割器句柄,作为该分割器的子部件。该函数可在子类中重新实现,以提供对自定义句柄的支持。
[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,则返回index 中 *min 和 *max 的分割器有效范围。
QSplitterHandle *QSplitter::handle(int index) const
返回分割器布局中位于给定index 的项目左侧(或上方)的句柄,如果没有该项目,则返回nullptr
。位于索引 0 的句柄总是隐藏的。
对于阿拉伯语和希伯来语等从右到左的语言,水平分割器的布局是相反的。位于index 的句柄将位于 widget 的右侧。
另请参阅 count()、widget()、indexOf()、createHandle() 和setHandleWidth()。
int QSplitter::indexOf(QWidget *widget) const
返回指定widget 在分割器布局中的索引,如果未找到widget ,则返回-1。这也适用于句柄。
有多少个子窗口部件,就有多少个句柄,但位于 0 位置的句柄总是隐藏的。
void QSplitter::insertWidget(int index, QWidget *widget)
将指定的widget 插入分割器布局中给定的index 。
如果widget 已在分割器中,它将被移动到新位置。
如果index 是一个无效索引,那么该 widget 将被插入到末尾。
注意: 分割器拥有 widget 的所有权。
另请参阅 addWidget(),indexOf() 和widget()。
bool QSplitter::isCollapsible(int index) const
如果index 上的 widget 是可折叠的,则返回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 尚未成为分割器的子节点,则返回刚刚被替换的部件。否则,返回空值,不会进行任何替换或添加。
新插入的 widget 的几何形状将与被替换的 widget 相同。它的可见和折叠状态也会被继承。
注: 分割器拥有widget 的所有权,并将被替换部件的父节点设置为空。
注: 由于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,该部件将不可见。部件的大小策略将被保留。也就是说,小于相关 widget 最小尺寸提示的值将被提示值取代。
另请参见 sizes().
void QSplitter::setStretchFactor(int index, int stretch)
更新位于index 位置的 widget 的大小策略,使其拉伸系数为stretch 。
stretch 不是有效伸展系数;有效伸展系数是通过将 widget 的初始大小乘以 计算得出的。stretch
提供该函数是为了方便起见。它等同于
QWidget *widget = splitter->widget(index); QSizePolicy policy = widget->sizePolicy(); policy.setHorizontalStretch(stretch); policy.setVerticalStretch(stretch); widget->setSizePolicy(policy);
[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 是与 widget 右边缘的距离。
另请参阅 moveSplitter() 。
QWidget *QSplitter::widget(int index) const
返回分割器布局中index 处的部件,如果没有该部件,则返回nullptr
。
另请参阅 count(),handle(),indexOf() 和insertWidget().
© 2025 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.