热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

QSplitter使用详解

阅读《C++GUIProgrammingwithQt4,2ndEdition》第六章布局管理器中的第三节关于Splitters的内容,并尝试实现书中的示例,发现实际效果与书中描述存在差异,尤其是分界线部分。

在阅读《C++ GUI Programming with Qt 4, 2nd Edition》第六章“布局管理器”的第三节“Splitters”时,我按照书中的示例进行了实践,但发现实际效果与书中描述有很大不同,尤其是在分界线方面。

书中提到的分界线在实际运行中几乎不可见,因为它们的颜色和背景色完全一致。书中并未详细说明如何处理分界线(可能在后续章节中有介绍)。

以下是我在 main 方法中编写的代码:

QSplitter *mainSplitter = new QSplitter(Qt::Horizontal); QLabel *label = new QLabel(QObject::tr("A")); QLabel *label2 = new QLabel(QObject::tr("B")); mainSplitter->addWidget(label2); mainSplitter->addWidget(label); mainSplitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); mainSplitter->show(); 

运行后,分界线几乎不可见:

而书中的效果是:

分界线的差异非常明显。经过查阅资料,我发现分界线实际上是由 QSplitterHandle 类对象表示的。通过以下代码可以修改分界线的样式:

mainSplitter->setStyleSheet("QSplitter::handle { background-color: black }"); // 设置分界线的样式 mainSplitter->setHandleWidth(20); // 设置分界线的宽度 

添加上述代码后的效果如下:

分界线的背景颜色变为黑色,并且宽度显著增加,说明代码生效了。如果有多个分界线,我们可以通过以下代码单独修改某一条分界线的样式:

QSplitterHandle *handle = mainSplitter->handle(1); // 注意索引从1开始,如果找不到分界线,将返回NULL if (handle) { handle->setFixedWidth(1); } 

效果如下:

可以看到,B 和 A 之间的分界线宽度被设置为1。如果想禁用分界线的拖动功能,可以使用 `handle->setDisabled(true);`。

对于 B 和 A 的大小控制,可以通过 QSplitter 的 `setStretchFactor` 方法实现。该方法的声明如下:

void setStretchFactor(int index, int stretch); 

第一个参数 `index` 是子控件的索引值,从0开始。这里 B 是0,A 是1;第二个参数 `stretch` 是拉伸系数,类型为 int。以下是一些具体的测试案例:

1. `mainSplitter->setStretchFactor(0, -2);`

效果如下:

B 占据了所有多余的空间,说明拉伸系数为负整数的控件将占据最大的空间。

2. `mainSplitter->setStretchFactor(0, -2);`
`mainSplitter->setStretchFactor(1, -4);`

效果如下:

B 和 A 平分了空间,说明拉伸系数为负整数的控件会尽可能占据空间,而不考虑负整数的具体值。

3. `mainSplitter->setStretchFactor(0, 0);`
`mainSplitter->setStretchFactor(1, 0);`

效果同第2个案例。

4. `mainSplitter->setStretchFactor(0, 0);` // 可以注释掉,效果相同
`mainSplitter->setStretchFactor(1, 1);`

效果如下:

5. `mainSplitter->setStretchFactor(0, 4);`
`mainSplitter->setStretchFactor(1, 8);`

效果如下:

6. `mainSplitter->setStretchFactor(0, -4);`
`mainSplitter->setStretchFactor(1, 8);`

效果如下:

从第1、2和6个测试案例可以看出,拉伸系数为负整数的控件将占据最大的多余空间。从第3、4和5个测试案例可以看出,即使不设置某个控件的拉伸系数,其默认值也为0。拉伸系数为0的控件会将多余的空间让给拉伸系数为正整数的控件。


推荐阅读
  • ML学习笔记20210824分类算法模型选择与调优
    3.模型选择和调优3.1交叉验证定义目的为了让模型得精度更加可信3.2超参数搜索GridSearch对K值进行选择。k[1,2,3,4,5,6]循环遍历搜索。API参数1& ... [详细]
  • 本文详细介绍了ASP.NET缓存的基本概念和使用方法,包括输出缓存、数据缓存及其高级特性,如缓存依赖、自定义缓存和缓存配置文件等。通过合理利用这些缓存技术,可以显著提升Web应用程序的性能。 ... [详细]
  • 利用CSS3和React实现数字滚动动画组件
    在前端开发中,数字滚动动画是一个常见的需求。本文将详细介绍如何使用CSS3和React构建一个数字滚动动画组件,包括组件的代码实现和样式设计。如果您对HTML版本感兴趣,欢迎留言获取。 ... [详细]
  • python爬虫Demo
    1爬虫功能:爬取某域名下所有网页,比如爬取python文档 https:docs.python.orgzh-cn3 ,爬取之后, ... [详细]
  • MapReduce原理是怎么剖析的
    这期内容当中小编将会给大家带来有关MapReduce原理是怎么剖析的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 ... [详细]
  • 本文探讨了在JavaScript中执行字符串形式代码的多种方法,包括使用eval()函数以及跨页面调用的方法。同时,文章详细介绍了JavaScript中字符串的各种常用方法及其应用场景。 ... [详细]
  • addcslashes—以C语言风格使用反斜线转义字符串中的字符addslashes—使用反斜线引用字符串bin2hex—函数把包含数据的二进制字符串转换为十六进制值chop—rt ... [详细]
  • 开发笔记:Python:GUI之tkinter学习笔记1控件的介绍及使用
    开发笔记:Python:GUI之tkinter学习笔记1控件的介绍及使用 ... [详细]
  • Java Set集合源码深度解析
    本文将深入探讨Java集合框架中的Set接口及其主要实现类HashSet、LinkedHashSet和TreeSet的源码实现,帮助读者理解这些集合类的工作原理及应用场景。 ... [详细]
  • 利用HTML5 Canvas高效构建电信网络拓扑图
    电信网络拓扑图在实际应用中具有很高的实用价值。本文介绍了一个基于HTML5 Canvas的电信网络拓扑图项目,不仅实现了基本的图形展示功能,还加入了自动布局和属性栏功能,使项目更加完善。此Demo经过细微调整即可直接应用于实际项目中。 ... [详细]
  • 本文详细介绍了Java集合框架中的Collection体系,包括集合的基本概念及其与数组的区别。同时,深入探讨了Comparable和Comparator接口的区别,并分析了各种集合类的底层数据结构。最后,提供了如何根据需求选择合适的集合类的指导。 ... [详细]
  • 本文详细介绍如何在 Windows 环境下安装 Ubuntu 12.04 版本的 Linux 操作系统,包括必要的软件下载、配置步骤以及注意事项。 ... [详细]
  • 本文探讨了如何使用Ruta工具从具有特定格式的文本文件中准确提取借款人名称等关键信息。通过实例分析,提供了解决方案和代码示例。 ... [详细]
  • Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
    go,通过,map,filter,foreach,等,流,式,ap ... [详细]
  • 本文介绍如何利用QFileSystemModel进行目录的浏览、创建及删除操作,并提供了一个简单的对话框界面实现。 ... [详细]
author-avatar
为了未来而奋斗2010
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有