一、前言
前面学习的所有代码,都是基于QWidget控件。QWidget更多的是作为别的窗口的一个部分。
Qt中的QMainWindow就是窗口的完全体
Menu Bar菜单栏
Tool Bar Area 工具栏,类似于菜单栏,工具栏本质上就是把菜单中的一些比较常用的选项,直接放到工具栏里了,直接点工具栏中的按钮就能快速生效。
Dock Widget Area 铆接部件,就是一个子窗口。
Central Widget 中央控件,窗口最核心的部分。
Status Bar 状态栏。
二、菜单栏的使用
一个主窗口最多只有一个菜单栏,工具栏本质上就是菜单中的一些选项的快捷方式
菜单栏(QMenuBar) -》菜单(QMenu) -》菜单项(QAction)
图形化界面的创建
代码创建
如何让我们的菜单项有反应,被点击的时候会触发一个信号,triggered信号触发。
1、菜单添加快捷键
给菜单和菜单像设置快捷键,设置好的快捷键就可以搭配alt来使用了。
通过给文本中添加&F这样的操作,就是添加了快捷键alt+F。
代码:
给QAction添加快捷键
代码:
2、添加子菜单:
菜单栏 -》菜单 -》子菜单 -》子菜单,QMenu也提供了addMenu,通过这个操作给某个菜单添加子菜单。
代码:
添加分割线和添加图标
菜单里菜单项特别多,就可以通过分割线进行分组
QMenu中提供了addSeparator这样的函数。来添加分割线
代码:
添加图标:
代码:qrc,用到QIcon类。
如果给QMenu设置图标,当前QMenu是长在QMenuBar上的,此时文本就不显示。图标覆盖了文本,QMenu是子菜单,图标和文本是都能显示的。
QMenuBar创建方式的讨论。
之前程序自己已经创建好了一个QMenuBar当前设置新的QMenuBar进来的时候,就会导致旧的QMenuBar脱离了Qt的对象树了,意味着后续就无法对这个对象进行释放了。
上述程序如果窗口关闭,对象树释放,此时进程也就节数了,进程结束,自然所有内存都回收给系统了,上述内存泄露也不会造成影响。但是如果这样的代码时出现在一个多窗口的程序中。如果涉及到窗口的频繁跳转切换,上述内存泄露就会更严重一些,但是实际上由于现在的计算机内存都比较充裕,上述内存泄露都还好,当然即使这样,我们也希望代码要规范一些。
如果QMenuBar已经存在,直接获取并返回。
如果QMenuBar不存在,就先创建一个新的,再返回。如果获取到已经存在的QMenuBar,这里的设置就是自己替换自己,还是自己,仍然在对象树上。
工作中可能会参与一些嵌入式的开发,嵌入式设备具有的硬件资源就比较紧张了。
三、QToolBar的使用
工具栏就是应用程序中集成各种功能实现快捷键使用的一个区域,可以有多个也可以没忽悠。
Qt中使用QToolBar表示工具栏对象。工具栏往往也可以手动移动位置。
代码:
之前设置的文字不会被删除,会变成一个ToolTip,另外也可以手动设置这里的toolTip
工具栏往往也是和菜单栏搭配使用的。工具栏中的QAction也可以出现在菜单中
如果一个QAction既是QMenu的子元素,又是QToolBar的子元素释放的时候,不会重复delete。
创建多个工具栏
代码:
设置工具栏出现的初始位置:
允许提放到哪些边缘:setAllowedAreas方法
设置不允许浮动
设置不允许移动
四、QStatusBar的使用
它是一个状态栏
代码:
给状态栏中添加子控件
五、QDockWidget的基本使用
浮动窗口 =》子窗口。Qt中使用QDockWidget来实现
六、Qt中的对话框
打开某些网站,不经意间就会弹出各种奇奇怪怪的窗口。对话框往往用户和用户之间进行短平快的操作。Qt中使用QDialog类表示对话框。针对一个已有的项目,也可以创建一些类,继承自QDia-log,实现咱们自定义的对话框。
Qt内置的对话框有:QFiledialog,QColorDialog,QFontDialog,QInputDialog和QMessageBox对话框。总体来说,基于QDialog作为父类创建出来的程序窗口和之前通过QWidget创建出来的非常相似。
实际开发中,更多的情况,往往不是直接在创建项目的时候继承自QDialog,而是在代码中,创建额外的类,让额外的类继承自QDialog,主窗口,一般不会作为一个对话框,主窗口可以再产生一些其他的对话框。
代码:主窗口中,点击按钮弹出一个对话框。
QDialog其实也是QWidget的一个子类,QWidget的各种属性方法,QDialog也能使用。
不同于界面上的其他控件,此处QDialog每次按下按钮,就会创建一个新的QDialog对象并进行显示。一个程序运行过程中,可以无数次点击这个按钮,进一步就产生出无数个这样的对象了=》内存泄露。就怕你的这一个对象占用内存很多呢,你的机器本身剩余的内存很少呢。正确的做法,应该是让用户点击对话框关闭按钮的时候才进行delete操作。
要想自定义对话框,就需要继承自QDialog创建类。
1)纯代码的方式来自定义对话框
2)通过图形化来自定义对话框
关键操作是创建一个ui文件
model 属性,是一个bool值,模态/非模态。
模态:弹出对话框的时候,此时用户无法操作父窗口,必须得完成对话框内部出的操作,关闭对话框之后。
非模态:弹出对话框的时候,用户可以操作父窗口。前面写的几个代码,都是非模态对话框
把show改成exec就可以改编成模态对话框。
QMessageBox的使用
QMessageBox用来显示一个消息给用户,并且让用户进行一个简单的选择。
代码:
添加自定义按钮
快速创建QMessageBox对话框
QColorDialog的使用
内置了调色板的功能
Qt中的QColorDialog的功能就是内置了调色板,效果就和上述的调色板相似。
getColor这个函数就能够弹出一个模态对话框,用户选择颜色之后,点击确定,对话框关闭,getColor返回的值就是用户选择的颜色值。它是一个静态函数,不必创建对话框对象,就可以直接使用。
代码:
通过ARGB来展示的。
alpha就是不透明度(opacity)
使用 0 - 1这样的小数表示RGB的值,1就对应到整数的255,0就对应到整数的0。
QFileDialog的使用
通过QFileDialog可以选择一个文件,能够获取到这个文件的路径,打开文件/保存文件
代码:
此处的打开/保存这里的功能都是需要额外去实现的。并不是说直接一按保存就真的保存了。Qt针对文件的操作。
QFontDialog的使用
字体对话框类
当用户再这里设置好了属性并且点击ok的是函数就会返回一个QFont对象。
把用户选择的字体,设置到按钮上
QInputDialog的使用
输入对话框,请用户输入一个具体的数据,可以是整数,可以是浮点数,还可以是字符串,QInputDialog提供了几个静态函数getDouble,getInt,getItem
代码:
小结
Qt窗口程序
1、菜单栏(QMenuBar) =》 菜单(QMenu) =》 菜单项(QAction)
2、工具栏(QToolBar) =》菜单项(QAction)
3、子窗口(QDockWidget)=》QWidget =》放置其他的控件
4、状态栏(QStatusBar)=》QWidget
5、对话框(QDialog)=》自己手动继承的方式,针对QDialog进行扩展。
QMessageBox、QFileDialog、QColorDialog、QFontDialog、QInputDialog。
得到了更完整的应用程序。