窗口和布局是Qt主要的组成部分,Qt为此封装了至少几百个Class,要全部掌握这些Class是不现实的,也是不明智的。本章重点介绍几个常用的窗口和布局管理器的基本用法,只帮助起到一个引领入门的作用。对于更多的功能,还需要在实践中自己动手翻阅帮助文档。前面我们已经实现了一个全部为手写代码的窗口,这一章节就来学些Qt设计师快速窗口设计的强大功能。

本章将实现一个较为复杂的窗口,也是比较常见的窗口:配置管理窗口。这里只介绍窗口UI的实现,功能实现在此省略,有兴趣的同学可以自己下去作为练习来实现。先看效果图:

整个界面分上中下3个部分:
1、顶部为标题栏,实现图标、标题和退出按钮,我们自定义实现外观框架;
2、中间部分又分为左右两块,左边为导航按钮,右边为设置页面,为简单起见,只做了3个页面;
3、底部是操作按键,包含确定,取消和应用。这里不实现其功能,请大家下来后自行实现。

整体布局

打开Qt设计师,第一步我们应当做一个整体的规划设计。如下图,我已经做好了这样一个UI框架:

这里我建议将每个区域都使用QFrame容器来先行填充,就好比我们修房子一样,总得先画个草图吧。为什么不使用Layout呢?因为Layout在实际设计界面时不如QFrame拖动那么方便,多做几个这样的界面你就会深有体会。再看看类的关系:

Widget对象已经使用垂直布局管理器将三个QFrame窗口包含进来,并设置margin和space属性为0,这里的上下QFrame都设置了固定的高度,这样中间的区域就可以自由拉伸。

标题栏实现

图标
图标使用QLabel实现,设置相关属性如下:
最大尺寸和最小尺寸为24px;
pixmap设置图标图片;
scaleContent允许图片自动缩放以适应窗口大小。

标题文本
同样使用QLabel实现,分别设置字体和颜色。颜色在QWidget属性的styleSheet中设置color属性为白色字体。

退出按钮
采用QPushbutton类,设置相关属性如下:
最大和最小尺寸都限制在24px;
设置icon图标资源路径并限制大小为24px,同按钮一样大小;
设置styleSheet属性为background-color: transparent;,即设置背景透明,只显示图片;

标题栏
给标题栏设置一个不一样的背景颜色,在styleSheet属性中设置background-color: rgb(0, 85, 127);固定高度设置为28px。

布局管理
在标题文字和退出按钮中间加入一个“弹簧”按钮,当窗口尺寸变化的时候,它能保证退出按钮只会出现在最右边,标题文字只会在最左边紧靠图标的位置。当一切控件都“摆好”位置之后,选中titlebar窗口,选择水平布局。然后再次点击titlebar窗口,会发现多了一栏布局属性:

将这里的属性全部设置为0。
此时我们的标题栏已经有了,但是程序默认的标题栏还在,我们还需要额外加入点代码,去掉程序默认的标题栏,并将退出按钮和程序退出事件关联起来。在主程序的构造函数中,加入代码:

    setWindowFlags(windowFlags() | Qt::FramelessWindowHint);connect(ui->btnExit, SIGNAL(clicked(bool)), this, SLOT(close()));

第一行设置窗口为无边框窗口,第2行正如前面学习过的,将按钮的点击信号和主窗口的关闭槽关联,从而实现点击退出按钮时关闭程序。因为只有一个主窗口,所有当主窗口关闭时,Qt就会通知app自动退出。这里的connect也可以直接在Qt设计师界面中进行,首先我们需要切换设计模式到信号槽设计:

如上图,Qt设计师有4种设计模式,分别为窗口编辑,信号槽设计,伙伴窗口设计和窗口顺序设计,默认都是第一种窗口设计模式。我们切换到第2种信号槽模式。当鼠标在其中移动的时候,对应的窗口会被红色外边框包围,选择退出按钮并按住鼠标,拖动鼠标到设计窗口的外部再释放,出现信号连接配置窗口:

勾选“显示从QWidget继承的信号和槽”,会将QWidget的槽函数一并显示。这里我们选择btnExit按钮的clicked()信号,再选择Widget窗口的close()槽函数,点击确定就完成信号到槽函数的关联。
我们也可以在另外一个窗口中来增加或删除这些关联,见下图:

现在先运行一下程序,并点击关闭按钮试试看效果吧(也可以在设计器界面按下Alt+Shift+R进行预览)。
这个标题栏并不完善,至少还应该实现拖动功能,我们将在后面的章节实现标题栏的拖动功能。
题外话:作为一个开发者,总要时常给予自己一些奖励,当完成一个小功能时,运行并验收下成果,再赞美下自己勤劳的双手和聪明的大脑,算作给自己的鼓励。我们没有漂亮的程序员鼓励师,只能靠自己不停的安慰自己,相信付出总会有收获!

中间区域

中间区域包括两部分:左边导航和右边属性页。

导航
这里我采用QListWidget控件实现。拖动控件到左边区域,双击控件会弹出子项设置框。先添加3项并设置对应的图标。返回到QListWidget控件并设置好下列属性值:
设置spacing属性,给每项增加一个间隔4px;
设置iconSize属性为32*32,字体设置为新宋体12号,这样图标就变的比较合适;
设置currentRow属性为0,默认选择第一项。

属性页
拖动QStackedWidget控件到右边作为属性页的框架。QStackedWidget控件是一个控件容器,它实现了分页显示属性页面的效果。这里只需要实现3个属性页即可,默认Qt设计师已经为我们创建了两个属性页,在控件上点击鼠标右键,选择插入页创建第3个属性页。请分别在3个属性页上设计一个配置管理界面,关于拖动控件设计界面实在太简单,它不是我们这个入门课程应该讲解的内容。

此处省略1000字…

设置好属性页面后,将QListWidget属性currentIndex设置为0,默认选择第一项,使得显示和QListWidget一致。切换到信号槽模式,点击QListWidget控件按住鼠标并拖动到QStackedWidget控件上,在弹出的设置界面中将currentRowChanged(int)和setCurrentIndex(int)槽关联,此时点击QListWidget控件将触发currentRowChanged()信号,然后调用QStackedWidget的setCurrentIndex()函数,切换属性页面。

此时还剩下最后一步,将中间区域所在的QFrame设置为左右布局,然后按下Alt+Shift+R看看效果吧!

控制栏区域

控制区域包含3个按钮控件,分别拖入到底部的QFrame容器中。
如果觉得字体太小,可以设置font属性改变字体。如果需要将3个控件的字体设置一样,没有必要对每个按钮都分别进行设置,只需要将父窗口QFrame的字体改变就可以。3个按钮应该摆放在右边,左边拖入一个水平“弹簧”控件,占用多余的空间,然后对父窗口QFrame进行水平布局,并微调布局管理器。设置属性如下:

只保留右边的margin为6px,其余都设置为0。设置Spacing为12px增大控件之间的间隔。
至此,一个稍微有点复杂的界面总算大功告成了,准备犒劳犒劳自己吧!

好吧,应该停下来喝口茶了,作为一个程序员,养成常喝茶水是一个不错的习惯,能帮助我们的身体排出一些长时间坐在电脑面前产生的垃圾物。

编译运行一下程序,看看效果如何。

Qt编程入门(2) : 窗口和布局(2)相关推荐

  1. 《Qt编程入门》配套代码下载

    精品教程目录 - qt qml linux 嵌入式 教程! (qter.org) yafeilinux 开源 共享 自由--嵌入未来

  2. 学习笔记之Qt从入门到精通(三)

    整理日期: 2010年4月9日 本文是学习笔记之Qt从入门到精通(二)的接续 Part 3: 进阶学习 Qt4 学习笔记 Qt 可以运行在不同的平台,像是Unix/X11.Windows.Mac OS ...

  3. Qt 5入门指南之Qt Quick编程示例

    Qt 5入门指南之Qt Quick编程示例 使用Qt创建应用程序是十分简单的.考虑到你的使用习惯,我们编写了两套教程来实现两个相似的应用程序,但是使用了 不同的方法.在开始之前,请确保你已经下载了Qt ...

  4. 《Qt图形界面编程入门》课后习题全解

    代码地址 https://github.com/duganlx/QT 说明 以下答案并非来自官方,而是本人自己实现的,若有啥问题,欢迎讨论(^-^) 所基于的书籍为<Qt图形界面编程入门> ...

  5. python可视化窗口编程-Python可视化界面编程入门

    Python可视化界面编程入门具体实现代码如所示: (1)普通可视化界面编程代码入门: import sys from PyQt5.QtWidgets import QWidget,QApplicat ...

  6. 《Java 2D游戏编程入门》—— 1.5 创建一个主动渲染的窗口

    本节书摘来异步社区<Java 2D游戏编程入门>一书中的第1章,第1.5节,作者:[美]Timothy Wright(莱特),更多章节内容可以访问云栖社区"异步社区"公 ...

  7. QT编程从入门到精通(全系列开展QT学习)

    目录 第一章:认识QT 第二章:Qt下载与安装 第三章:Qt Creator 第四章:Qt程序创建基础 第五章:Qt GUI应用程序设计 5.1 UI文件设计与运行机制 5.2 可视化UI设计 5.3 ...

  8. WPF编程基础入门 ——— 第三章 布局(五)布局面板WrapPanel

    WPF布局--布局面板WrapPanel WPF--WrapPanel布局控件 WrapPanel实例--十个按钮 WPF--WrapPanel布局控件 WrapPanel(自动折行面板),允许任意多 ...

  9. Python Qt GUI设计:窗口布局管理方法【强化】(基础篇—6)

    目录 1. 水平布局类(QHBoxLayout) 2.垂直布局类(QVBoxLayout) 3.网格布局类(QGridLayout) 3.1.单一的网络布局 3.2.跨越行.列的网络布局 4.表单布局 ...

最新文章

  1. Error: “incorrect inclusion of a cudart header file”
  2. Java NIO Selector 详解
  3. mapper中 <include refid=“XXX“></include>标签 <sql id=“XXX“>标签
  4. JavaScript-语法、关键保留字及变量
  5. mac搭建nginx+rtmp直播流
  6. 打造安全的网站服务器
  7. office word 开发
  8. 【MM 模块】 Optimized Purchasing 优化采购 2
  9. 柴树杉:面向数据科学领域的新语言,Go+蓄势待发
  10. Linux 命令(81)—— chmod 命令
  11. js 关系图插件_babel插件的相关知识
  12. iOS安装CocoaPods详细过程
  13. 【资料】《数字电子技术基础》阎石第五版
  14. html5实现手写签名板,用于电子文档签名
  15. 极限中0除以常数_第七讲 极限存在准则和两个重要极限
  16. Spring【三】容器与Bean扩展点
  17. python 限定数据范围_python取值范围
  18. angular2 mysql_零起步学习angular2_angularjs教程_汇智网
  19. Ubuntu 22.04 ‘Jammy Jellyfish‘ 的新功能
  20. windows服务器详细安全设置

热门文章

  1. 华为 android 11,Android 11发布,华为正式官宣,新系统更值得期待!
  2. apache AH00132报错
  3. 2022-2028年中国香樟木家具行业发展战略规划及投资机会预测报告
  4. Mysql中的视图是什么?有什么作用?
  5. 如何修改本机MAC地址
  6. 百年之后共赴鸿蒙,我们是如何走到互删好友这一步的?
  7. MySQL 覆盖索引(Cover Index)
  8. VS功能之自动生成json格式类
  9. java链接sql server_Java连接SQL Server详细步骤
  10. CUGBACM2022校新生选拔赛总结