一晃快有半个月没有写博客了,但是其实每天还是或多或少的敲了些代码。最近主要是了解QT语言,然后再结合前阵所学的openCV的知识,包括高斯滤波啊,直线、圆的检测啊等等,做出可视化界面来,更加方便学习,也更加熟悉软件开发的流程。
QT基础之布局管理器
其实开始使用QT,发现它和Java编写界面的方式有一定程度上是很相似的,就比如说布局!首先我们探讨下为什么我们要使用布局?其实除了使用布局,还可以使用绝对位置来定位窗体上的各个控件,比如说,我要把一个QPushButton放在窗体的(100,100)这个位置,我们完全可以用
btn->setGeometry(100, 100, 10, 10);
或者
btn->move(100, 100);
但是,如果这个界面是可以随用户放缩的,那么问题就来了。这个组件永远在这个位置,而不是自适应窗体大小的变化,这样就会出现窗口“畸形”,控件大范围集中在一个地方。当然机智的你会说,那就不让窗体自由变大变小呗。。。哈哈,good idea,but 客户假设就有这种需求呢?------布局管理器来解决这一切!
布局管理器分类:
1. 水平布局
2. 垂直布局
3. 网格布局
(1)水平布局:言下之意就是将空间延水平方向摆开,比如说:
我们可以使用layout::addwidget(控件对象)来添加我们需要的控件;
(2)垂直布局:和水平布局类似,如下图:
同样的,我们可以用layout::addwidget(控件对象)来添加我们所需要的控件对象。
(3)网格布局:上述所说的水平布局、垂直布局相对来说比较单调,所以,在实际情况下,往往是应用网格布局或者网格布局配合水平垂直布局使用,可见网格布局相对来说更加灵活。如下图所示:
上述是一个3*3的网格,网格中可以是控件也可以是一个布局管理器!所以说网格布局非常使用也非常灵活!如果要加入控件,我们不但需要指出控件对象,而且要将布局位置设置清楚,这里布局位置行列均从0开始:
layout::addWidget(控件对象,行,列);
如果加入的是一个布局管理器,那么我们需要指定布局管理器对象和网格行列位置:
layout::addLayout(布局管理器对象,行列);
但是我们考虑到这样一个情况,某个控件很大,若按照正规网格来说,一个位置可能放不下,可能需要两个位置或者多个位置(即占用n行n列),如:
这时,控件5从第1行(从0开始)第1列算起,占用1行2列,于是该控件嵌入布局管理器中需要指定行列跨度:
layout::addWidget(控件对象, 1, 1, 1, 2);
这样网格布局就将更加方便灵活。
注:布局管理器添加问题:根据QMainWindow、QDialog、QWidget三种不同的窗体,添加布局管理器的方法是不同的。实际上就QMainWindow和QDialog、QWidget区别,那么首先我们要简单了解下这三种窗体的区别:
简单来说,QWidget是基类,QMainWindow和QDialog都是继承QWidget来的,既然QWidget是基类,那么意味着这个窗体是最基本的,类似于一张白纸。在这个最基础的窗体上接受鼠标事件、键盘事件等很多基础事件,同时可以在窗体上绘图。
QMainWindow顾名思义,这是一个主界面,主界面上往往有菜单栏、工具栏等,那么QMainWindow可以很好的提供。
QDialog是一个顶级窗体,也是对话框体的基类,既然是对话框,完成的就是一些简单的短期任务或者与用户进行沟通的功能,分为模态对话框和非模态对话框,这里后面会细说。
然而,QMainWindow还有一些不一样的地方,因为是主界面窗体,很多东西为了方便已经提供好了,实际上这个窗体已经含有了自己的布局管理器,要是直接加布局是不会成功的。如:
this->setLayout(layout);
对于QMainWindow是行不通的,我们需要在主窗体上的centralWidget层添加这个布局。代码如下:
QGroupBox* gb = new QGroupBox(this);
gb->setLayout(gl);//gl是定义的Layout对象
this->setCentralWidget(gb);
这样的布局设定才是成功的!!!!!!!!!
实战演练:
现在我想做如下窗体:
为了做相似性分析,我需要1、2分别显示原图片,3、4分别显示对应的直方图。右下角对应三个按钮分别是打开第一张图、打开第二张图、计算相似性。有了布局管理器的概念,我们将界面做如下分析:
整体使用网格布局,三个按钮处再使用垂直布局嵌入到网格布局中,这样就完美了!
代码实现如下:
//布局(总的是grid布局、加上垂直布局)
QGridLayout* gl = new QGridLayout(this);
gl->addWidget(imgLab1, 0, 0);
gl->addWidget(imgLab2, 0, 1);
gl->addWidget(imgLab3, 1, 0);
gl->addWidget(imgLab4, 1, 1);
QVBoxLayout* vl = new QVBoxLayout(this);
vl->addWidget(btn1);
vl->addWidget(btn2);
vl->addWidget(btn);
gl->addLayout(vl, 1, 2);
//两行1:1
gl->setRowStretch(0, 1);
gl->setRowStretch(1, 1);
QGroupBox* gb = new QGroupBox(this);
gb->setLayout(gl);
this->setCentralWidget(gb);
关于网格布局中的一些简单的设置:
1.行列按比例网格布局:网格布局每个网格的大小是不确定的,各个网格之间不是规范对称的,而是有大有小的,那么我们若需要网格布局的行列按比例生成,那么我们就要用到如下语句:
如第一行和第二行比例1:1 :
gl->setRowStretch(0, 1);
gl->setRowStretch(1, 1);
如第一列和第二列比例1:1 :
gl->setColumnStretch(0, 1);
gl->setColumnStretch(1, 1);
2.控件大小的调整:网格布局往往会适应其中控件的大小,而控件在网格中的填充方式也有几种(盗用API):
QSizePolicy::Fixed |
0 |
The QWidget::sizeHint() is the only acceptable alternative, so the widget can never grow or shrink (e.g. the vertical direction of a push button). |
QSizePolicy::Minimum |
GrowFlag |
The sizeHint() is minimal, and sufficient. The widget can be expanded, but there is no advantage to it being larger (e.g. the horizontal direction of a push button). It cannot be smaller than the size provided by sizeHint(). |
QSizePolicy::Maximum |
ShrinkFlag |
The sizeHint() is a maximum. The widget can be shrunk any amount without detriment if other widgets need the space (e.g. a separator line). It cannot be larger than the size provided by sizeHint(). |
QSizePolicy::Preferred |
GrowFlag | ShrinkFlag |
The sizeHint() is best, but the widget can be shrunk and still be useful. The widget can be expanded, but there is no advantage to it being larger than sizeHint() (the defaultQWidget policy). |
QSizePolicy::Expanding |
GrowFlag | ShrinkFlag | ExpandFlag |
The sizeHint() is a sensible size, but the widget can be shrunk and still be useful. The widget can make use of extra space, so it should get as much space as possible (e.g. the horizontal direction of a horizontal slider). |
QSizePolicy::MinimumExpanding |
GrowFlag | ExpandFlag |
The sizeHint() is minimal, and sufficient. The widget can make use of extra space, so it should get as much space as possible (e.g. the horizontal direction of a horizontal slider). |
QSizePolicy::Ignored |
ShrinkFlag | GrowFlag | IgnoreFlag |
The sizeHint() is ignored. The widget will get as much space as possible. |
上面说了很多种,这里仅介绍其中几种,其他参照上述英文解释:
Preferred:最佳尺寸,控件将与控件上的字符长度匹配,不会太长或者太宽
Fixed:填充尺寸,控件将几乎充满整个网格。
相关推荐
在深入理解QT-sniffer之前,我们首先需要对Qt和网络封包分析这两个概念有一个基本的认识。 Qt是一个跨平台的C++图形用户界面应用程序开发框架,由Qt Company提供。它广泛应用于桌面、移动和嵌入式设备上的应用程序...
通过这个为期六天的学习,你将建立起对QT框架的全面认识,具备独立开发QT应用的能力。"aa.txt"的内容将帮助你更好地规划学习路径,确保每天都能有效地掌握新的知识。记得理论学习与实践操作相结合,不断巩固提升。
本实训项目旨在帮助初学者掌握Qt开发环境的搭建,包括Qt Creator的基本使用、界面布局的认识以及Qt相关工具软件的配置。 ### 1. Qt Creator安装 安装Qt Creator的过程如下: 1. 双击下载的安装包,进入安装向导。...
它也提供了对各种类型窗口的全面支持,包括QMainWindow、对话框QDialog以及各种布局管理器,用于创建灵活的用户界面。 Qt的信号和槽机制是其独特的一种通信方式,它允许对象之间的通信而无需了解对方的具体实现。这...
首先,教程从基础入手,介绍了如何安装Qt Creator并创建第一个"Hello World"程序,让初学者对Qt环境有一个初步的认识。接着,教程通过编写多窗口程序和添加菜单图标,讲解了如何构建用户界面。在UI设计中,布局管理...
1. **了解Qt概述**:通过阅读Qt白皮书获取Qt的整体认识,理解其设计理念和技术优势。 2. **掌握基础编程**:在具备一定的C++基础之上,通过实践教程1(重点在于编码而非特性展示)和教程2(真实案例分析)深入学习Qt...
#### 第一章 初步认识Qt 1. **什么是Qt**:Qt是一个由奇趣科技在1991年开发的跨平台C++图形用户界面应用程序开发框架。它支持GUI程序的开发,并且也适用于非GUI程序,例如控制台程序。Qt与微软Windows平台上的MFC...
QT是Qt Company开发的一款强大的跨平台应用程序开发框架,广泛用于创建桌面、移动和...通过这个教程,初学者可以逐步建立起对QT的全面认识,掌握基本的QT编程技能,为进一步深入学习和实际项目开发打下坚实的基础。
在安博牛耳的学习资源中,这个PDF集合涵盖了从基础到高级的多个方面,帮助学习者逐步建立对QT开发的全面认识。 首先,1.1 嵌入式图形界面开发_基本介绍.pdf可能涵盖QT的基本概念,包括QT框架的核心组件、安装过程...
通过这24小时的学习,你将建立起对QT编程的全面认识,并具备开发基础QT应用的能力。 总之,QT作为一款强大的开发工具,不仅适合桌面应用开发,也在移动设备和嵌入式系统中有广泛应用。"24小时学通qt编程"这个教程将...
Qt是一个跨平台的应用...通过这些知识点的学习和实践,初学者可以逐步建立起对Qt的全面认识,并有能力开发出自己的跨平台应用程序。在实际操作中,结合代码示例、调试工具和文档资料,能更有效地加深理解和提升技能。
Qt控件不仅包括基本的GUI元素,还包括对话框、布局管理器等。布局管理器如QGridLayout、QVBoxLayout和QHBoxLayout,可以自动调整控件的位置和大小,以适应不同尺寸的窗口。此外,Qt还提供了一些高级控件,如...
通过"QT学习入门指南",初学者可以逐步建立起对QT的全面认识,并通过实践项目提升编程技能。QT的易用性和强大功能使其成为开发跨平台应用的理想选择,无论是桌面应用还是移动应用,都能得心应手。记得下载提供的"QT....
【Qt打地鼠游戏】是一种基于Qt框架开发的C++小游戏,它采用了面向对象的编程思想,结合了Qt库的强大功能,...通过阅读和实践这个项目,你可以深入理解Qt的图形界面编程,提升C++编程技能,并对游戏开发有更直观的认识。
4. **Qt Widgets**:熟悉各种Qt窗口部件(widgets),如按钮、文本框、标签、菜单等,以及如何在界面上布局这些部件。 5. **事件处理**:理解Qt的事件模型,如何编写事件处理器,响应用户的交互。 6. **信号与槽**:...
- **层次结构(Item Hierarchy)**:Graphics Items可以嵌套形成层次结构,子项会随父项一起移动和旋转,方便构建复杂的图形布局。 - **绘画(Drawing)**:通过重载QGraphicsItem的paint()方法,你可以实现自定义...
通过以上介绍,你应该对Qt Creator有了初步认识。实践是学习的最佳途径,现在就动手创建你的第一个Qt应用吧!在探索过程中,你会发现更多Qt Creator的实用特性和高级功能,这将极大地提高你的开发效率和代码质量。祝...
用户可以通过拖拽控件,调整布局,定义信号与槽来快速构建用户界面。在QT串口助手中,可能包括“打开/关闭串口”按钮、波特率设置下拉框、数据位、校验位、停止位的设置选项等。 五、构建与运行 1. 构建项目:在QT ...
《扫雷Qt源代码解析与Qt开发学习指南》 ...通过分析和理解这段代码,不仅可以提升Qt编程技能,也能对游戏开发有一个直观的认识。希望这个解读能为你的Qt学习之路提供帮助,让你在编程的世界中扫除障碍,迈向成功。