QT 中怎样使得控件与 界面等比例变化
转自:https://github.com/exoticknight/blog-post/blob/master/python-with-Qt-application-development/python%20%C3%97%20Qt%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%20%C2%B7%202%20--%20%E7%95%8C%E9%9D%A2%E5%88%9D%E6%AD%A5%E8%AE%BE%E8%AE%A1.md
之前的一篇可以算是前置知识的快速介绍。从这篇开始就是正式地编写应用了。
为了兼顾举举例子和真实性,选了这么一个应用:PQ笔记。基本的功能如下:
- 笔记支持富文本粘贴
- 按文件夹分类笔记
画出大概的样子
先来一个大概的设计图。
就是一个规规矩矩的三栏布局,左边是笔记本的目录树,中间是文档列表,右边是文档内容。这个只是现阶段的大概构思,最终做出来不一定是这样的,有可能在一些细节上会有所更改,但是整体界面几乎都可以定下来了。
打开ui_mainwindow.ui,从Containers里拉出三个Widget,分别命名为widgetLeft、widgetMiddle和widgetRight。这就是左中右三栏的容器。
在左边栏中拖入一个pushButton和一个treeView,分别对应设计图上的两个控件。注意,如果拖放位置正确(也就是QtDesigner知道你要将控件放进左边栏里面),你会看到左边栏widgetLeft会变暗了。
对着左边栏空白处点击右键,依次选择布局 -> 垂直布局。
可以看到控件非常听话地从上到下排列好了。这里为widget中的控件快速设定了一个布局,相当于告诉widget中的控件该如何显示自己。
注意,这个"布局"并不是widget中的属性,而是独立的另一个类QLayout及其子类的实例。在对象查看器中点选widgetLeft后在下面的属性编辑器中可以看到有一栏Layout,这个才是控件们服服帖帖的原因。只不过,当为一个widget选择了布局之后,QtDesigner自动给这个widget增加了一个布局,然后将widget里面的子控件加入到布局中,于是子控件们都知道应该如何显示了。
同理,在中间控件widgetMiddle中放入一个LineEdit和一个ListView,在右边控件widgetRight中放入TextEdit,并且设置好布局。
现在使用快捷键Ctrl + r预览,发现拉伸窗口的时候,里面的三栏控件没有任何反应,这可不是想要的效果。
注意整个窗口其实也是一个widget,同样需要为其设置布局。
再预览,出现一个新问题:三个栏不能各自调整大小。
要实现这个功能需要另外一种布局管理,分裂器(QSplitter)。分裂器允许元素调整各自的大小。
先打破布局。
按着ctrl选择三个分栏widget,注意是分栏widget,再在其中一个widget的空白处点击右键,在布局中可以看到有使用分裂器水平布局。
最后为窗口应用垂直布局就可以了。预览的时候当鼠标移动到分栏控件之间会发现可以调整大小了,同时调整窗口也能影响到三个分栏的大小。
从实际来说,调整窗口的大小的时候,更多是希望调整右边栏即文档显示栏的大小。
QSplitter还能设置一些细节。
找到QSplitter的属性:
- orientation,控件排列方向,水平还是垂直
- opaqueResize,是否实时显示调整
- handleWidth,调整条的宽度
- childrenCollapsible,控件调整成过小时是否会隐藏
似乎没有什么可以用的。
然而,问题的解决方法却不在QSplitter上,而在其子组件上。
实际上,几乎所有的widget,都有一个sizePolicy的属性,而在此属性中,有子属性Horizontal Stretch和Vertical Stretch,对应中文水平伸展和垂直伸展,决定水平和垂直的缩放比例。
在属性编辑器中,可以看到水平伸展的值默认为0,也就是左栏:中栏:右栏 = 0:0:0,现在将右栏的水平伸展值设为1,也就是左栏:中栏:右栏 = 0:0:1。
预览一下,效果就出来了。
原理应该是这样的,在窗口缩放的时候,默认的配置是 0:0:0,表示变化被平均分配到两个组件上了。而修改后子组件们根据已经设定好的比例 0:0:1,所有的因窗口缩放而引起的大小变化全部被分配到文档编辑组件上了。
布局管理(Layout Management)
布局可以在Widget Box里面看到,提供的有四个布局:
- Vertical Layout
- Horizontal Layout
- Grid Layout
- Form Layout
分别是垂直布局、水平布局、网格布局和表单布局。当然还有另外的自动布局,但是这四个基本能满足普通需要。
垂直/水平布局不用解释了。网格布局是类似表格,一个控件占据一个单元格位置;表单布局是类似平常表单,从上到下排成多行,每行分两栏,左边放标签控件,右边放输入框控件。
菜单
在新建一个窗体的时候,QtDesigner就已经为窗体添加上了QMenuBar,在窗体的标题栏下面可以看到一个经典的菜单栏,上面有在这里输入字样。只要双击并填上你希望显示的菜单名字,QtDesigner会自动生成一个菜单,在下拉列表上继续双击在这里输入将会自动生成QAction。QAction才是真正代表着菜单里的某个动作。
在下拉菜单里面,还能看到一个添加分隔符,是添加一个分割线的意思。当生成了一个QAction之后,可以看到右边有一个类似加号的图标,是将当前QAction转化为QMenu的意思,换句话说可以生成子级菜单。子级菜单的操作跟上面描述的菜单操作一模一样。
另外给各个action对象修改好名字,以供日后调用。
QT 中怎样使得控件与 界面等比例变化的更多相关文章
- 在Qt中使用ActiveX控件
Qt的windows商业版本提供了ActiveQt这个framework,使用这个组件我们可以在Qt中使用ActiveX控件,并且也开发基于Qt的ActiveX控件.ActiveQt包含了两个组件QA ...
- Qt中使用ActiveX控件
(转自:http://blog.csdn.net/tingsking18/article/details/5403038) 在Qt中使用ActiveX控件 Qt的windows商业版本提供了Activ ...
- QT中给各控件增加背景图片(可缩放可旋转)的几种方法
http://blog.csdn.net/liukang325/article/details/44832397 1. 给QPushButton 增加背景图片:背景图片可根据Button大小自由缩放. ...
- Qt实现表格树控件-支持多级表头
目录 一.概述 二.效果展示 三.实现方式 四.多级表头 1.数据源 2.表格 3.QStyledItemDelegate绘制代理 五.测试代码 六.相关文章 原文链接:Qt实现表格树控件-支持多级表 ...
- 在DevExpress程序中使用SplashScreenManager控件实现启动闪屏和等待信息窗口
在我很早的WInform随笔<WinForm界面开发之"SplashScreen控件">有介绍如何使用闪屏的处理操作,不过那种是普通WInform和DevExpress ...
- 结合ItemsControl在Canvas中动态添加控件的最MVVM的方式
今天很开心的收获: ItemsControl 中 ItemsPanel的重定义和 ItemContainerStyle 以及 ItemTemplate 三者的巧妙结合,在后台代码不实例化任何控件的前提 ...
- 关于WinForm引用WPF窗体---在Winform窗体中使用WPF控件
项目中有个界面展示用WPF实现起来比较简单,并且能提供更酷炫的效果,但是在WinForm中使用WPF窗体出现了问题,在网上找了一下有些人说Winform不能引用WPF的窗体,我就很纳闷,Win32都能 ...
- C#里WinForm开发中如何实现控件随窗体大小的改变而自动适应其改变(转)
在设计可供用户调整大小的窗体时,如何实现该窗体上的控件也应能正确地随窗体的改变而自动调整大小并且能重新定位?此时就要借助控件的.Anchor属性.Anchor属性定义控件的定位点位置.当控件锚定到某个 ...
- Android中通过WebView控件实现与JavaScript方法相互调用的地图应用
在Android中通过WebView控件,可以实现要加载的页面与Android方法相互调用,我们要实现WebView中的addJavascriptInterface方法,这样html才能调用andro ...
随机推荐
- [解决]java.io.IOException: Cannot obtain block length for LocatedBlock
在hadoop测试集群运行job的过程中发现部分运行失败,有Cannot obtain block length for LocatedBlock,使用hdfs dfs -cat ${文件}的时候也报 ...
- 网络编程:I/O模型
I/O模型 Unix下可用的5种I/O模型有: 阻塞式I/O 非阻塞式I/O I/O复用(select和poll,epoll) 信号驱动式I/O 异步I/O(POSIX的aio_系列函数) 一个输入操 ...
- [洛谷P1822] 魔法指纹
洛谷题目连接:魔法指纹 题目描述 对于任意一个至少两位的正整数n,按如下方式定义magic(n):将n按十进制顺序写下来,依次对相邻两个数写下差的绝对值.这样,得到了一个新数,去掉前导0,则定义为ma ...
- 【设计模式】 模式PK:策略模式VS桥梁模式
1.概述 我们先来看两种模式的通用类图. 两者之间确实很相似.如果把策略模式的环境角色变更为一个抽象类加一个实现类,或者桥梁模式的抽象角色未实现,只有修正抽象化角色,想想看,这两个类图有什么地方不一样 ...
- mysql 并发下数据不一致的问题分析及解决
MySQL 5.6 , InnoDB存储引擎,默认事务隔离级别(REPEATABLE-READ) 初始sql 脚本如下: CREATE DEFINER=`root`@`localhost` PROCE ...
- AWK文本分析工具-常用场景(持续更新中)
AWK help document:http://www.gnu.org/software/gawk/manual/gawk.html 问题 awk命令 备注 对请求IP统计分组排序? 显示列 ...
- UOJ#31 【UR #2】猪猪侠再战括号序列
传送门http://uoj.ac/problem/31 大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_CallMeGGBond. 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领域的兴趣:尤其 ...
- pythonTensorFlow实现yolov3训练自己的目标检测探测自定义数据集
1.数据集准备,使用label标注好自己的数据集. https://github.com/tzutalin/labelImg 打开连接直接下载数据标注工具, 2.具体的大师代码见下链接 https:/ ...
- sql server 在作业中 远程连接 oracle mysql sqlserver 数据库
在作业中执行远程连接时,需要对本次作业执行的步骤指定特定用户 并且该用户必须拥有所需操作数据库的db_owner角色,和服务器sysadmin角色 在作业中执行远程连接时,需要做登录映射 下面是我在作 ...
- css3动画总结