type
status
date
slug
summary
tags
category
icon
password
Email
文章首发于我的个人博客:欢迎大佬们来逛逛
1. QWidget
QWidget类是所有可视控件的基类,控件是用户界面的最小元素,用于接受各种事件(如:鼠标、键盘等)并且绘制出来给用户观看。
每个控件都是矩形的,他们按照Z轴顺序排列。
如果控件没有父控件,则称之为窗口,窗口会被一个框架包裹(包含标题栏,边框等),可以通过某些函数来修改边框属性。
窗口几何
Window and Dialog Widgets
QWidget提供了几个处理小部件几何形状的函数。其中一些函数操作在纯客户区(即不包括窗框的窗口)上,其他函数包括窗框。区分的方式是透明地涵盖最常见的用法。
- 包含窗口边框:
x()
,y()
,frameGeometry()
,pos()
,andmove()
- 不包含窗口边框:
geometry()
,width()
,height()
,rect()
,andsize()
注意,这种区别只对顶级小部件有意义。对于所有子小部件,frame geometry等于小部件的客 client geometry。
大小位置
获取坐标和大小
设置坐标和大小
固定大小
大小限定
去掉set就是获取函数
坐标系统转换
- 这几个函数都是转换相对坐标系用的. 用另一个坐标系统的坐标值, 来表达当前坐标系统中某个坐标所指向的某个点,
记住: 一定要先确两个坐标系统再确定一个点
- 相对坐标:获取自己相对于父控件的位置 QWidget::pos()
- 绝对坐标:将当前控件的相对位置转换为屏幕绝对位置 QWidget::mapToGlobal()
- 绝对坐标转为相对坐标:将屏幕绝对位置对应到控件的相对位置 QWidget::mapFromGlobal()
内容边距
设置小部件内容周围的空白,使其具有左、上、右和下的大小。边距被布局系统使用,并且可以被子类用来指定要绘制的区域(例如,不包括框架)。
案例:创建一个窗口,包含一个标签,标签内容为"社会我顽哥,人狠话不多 ",标签大小为300x300,让内容放在标签的右下角。
鼠标指针
指针形状
如果要全局设置鼠标光标样式,可以使用
QGuiApplication::setOverrideCursor()
, 设置鼠标指针的形状需要使用QCursor类,通过像素图或枚举指定鼠标光标形状。QCursor
QCursor提供了获取/设置鼠标全局坐标的静态方法。
顶层窗口相关
图标
标题
窗口标题附加操作!
此属性保存窗口中显示的文档是否有未保存的更改。
修改后的窗口是指内容已更改但尚未保存到磁盘的窗口。这个标志将根据平台的不同而有不同的效果。在macOS上关闭按钮会有一个修改过的外观;在其他平台上,窗口标题将带有“*”(星号)。
窗口标题必须包含“[*]”占位符,它指示“*”应该出现的位置。通常,它应该出现在文件名后面(例如,"document1.txt[*] -文本编辑器")。如果窗口没有被修改,占位符就会被删除。
注意,如果一个小部件被设置为已修改,那么它的所有祖先也将被设置为已修改。但是,如果在一个小部件上调用setWindowModified(false),这将不会传播到它的父组件,因为父组件的其他子组件可能已经被修改了。
如果你想要在窗口标题后面显示,应用程序名称,可以使用以下函数。(这个不算标题的一部分)
不透明度
窗口状态
枚举 | 描述 |
Qt::WindowNoState | 无状态 |
Qt::WindowMinimized | 最小化 |
Qt::WindowMaximized | 最大化 |
Qt::WindowFullScreen | 全屏 |
Qt::WindowActive | 活动窗口 |
如果窗口不可见(即isVisible()返回false),当show()被调用时窗口状态才生效。对于可见的窗口,会立即生效。例如,要在全屏模式和普通模式之间切换,使用以下代码:
为了恢复和激活最小化的窗口(同时保持其最大化和/或全屏状态),请使用以下命令:
最大化最小化
窗口标志
交互状态
是否禁用
是否显示/隐藏
setVisible
的马甲判断是否可见
帮助系统
Help System
toolTip
当鼠标悬停在空间上时,会在鼠标旁边显示"工具提示"
whatsThis
切换到whatsThis模式,鼠标点击控件会显示"这是啥提示"
- 先创建三个按钮
- 运行程序后按Shift + F1会出现当前获得焦点的widget的whatsThis信息
- 调用QWhatsThis的静态函数enterWhatsThisMode进入whatsThis模式,此时当鼠标移动到设置了whatsThis的widget上光标会出现一个问号,再点击则会出现whatsThis的窗口。
父子关系
返回控件坐标系中位置(x, y)处的可见子控件,没有则返回nullptr。
返回包裹所有子控件的矩形(隐藏的控件除外)
返回父控件
层级控制
焦点控制
单个控件
多个子控件
设置exe图标
设置完窗口图标之后,我们可能需要设置可执行程序exe文件的图标,这个稍微麻烦一点点,但是也是三步搞定,走起!
- 1,创建一个图标格式(ico)的文件,
可以将一个普通的图片转成.ico格式的图标文件
,图片格式在线转换
- 2,将转换好的ico文件放到源文件所在目录,即和CMakeLists.txt文件同级目录,并创建名为
icon.rc
的文件,写入如下内容。
- 3,最后在CMakeLists.txt中添加如下命令
最后重新运行程序,找到exe,完成!
设置窗口属性
- setAttribute用来设置小部件的属性,testAttribute查看是否设置了某种属性。
常用属性
枚举 | 值(十进制) | 描述 |
Qt::WA_AcceptDrops | 78 | 允许来自拖放操作的数据被拖放到小部件上(参见QWidget::setAcceptDrops()) |
Qt::WA_AlwaysShowToolTips | 84 | 为非活动窗口启用工具提示 |
Qt::WA_CustomWhatsThis | 47 | 表示小部件希望在“这是什么?”模式下继续正常运行。 这是由小部件的作者设置的。 |
Qt::WA_DeleteOnClose | 55 | 使Qt在小部件接受关闭事件时删除该小部件 |
Qt::WA_MouseTracking | 2 | 指示小部件启用了鼠标跟踪。 参见QWidget:: mouseTracking |
Qt::WA_TranslucentBackground | 120 | 指示小部件应该有一个半透明的背景,也就是说,小部件的任何非透明区域都将是半透明的,因为小部件将有一个alpha通道。 设置此标志将导致设置WA_NoSystemBackground。 在Windows上,小部件还需要设置Qt:: framesswindowhint窗口标志。 该标志由小部件的作者设置或清除。 |
Qt部署应用程序发布包
windeployqt.exe是Qt自带的工具,用于创建应用程序发布包。 简单来说,这个工具可以自动地将某程序依赖的库、资源拷贝到其所在目录,防止程序在其他电脑上运行报找不到库的错误。
原理
windeployqt.exe工作原理很简单,它会到当前的环境变量PATH配置的搜索路径中,查找应用程序所需要的库和资源,拷贝到应用程序目录中。
使用
- 先从开始菜单中打开「对应版本的Qt」的命令行终端界面,如下图:
- 然后再命令行中输入
windeployqt AppName
,AppName表示应用程序完整路径;
我们知道,Qt项目路径不能包含中文,所以为了保险起见,应用程序路径中不要包含中文。另外,如果应用程序路径中包含空格,需要用双引号将整个路径字符串包裹起来。
注意坑
大体上的流程只有这两步。 整个发布过程看似比较简单,但是其中还是存在一些坑的。
坑点一:未使用Qt的命令行终端执行发布命令,导致库版本拷贝错误
坑点二:未使用与Qt版本对应的windeployqt.exe
坑点三:发布时,默认文件不会覆盖
如果已经存在同名的文件,则不会自动覆盖,可以通过添加强制覆盖参数--force强制覆盖已存在的文件。
注意点:命令行在启动是,会有一行提示,
记得调用vcvarsall.bat来完成环境设置!
意思是说,我们还没有运行vcvarsall.bat,所以VS的环境变量没有配置好,因此不会拷贝VS相关的依赖库。
vcvarsall.bat是VS自带的配置环境变量的批处理文件。它的位置取决你的安装位置,我的在
D:\MySoftWare\Microsoft Visual Studio\2022\Professional\VC\Auxiliary\Build
下,接下来就尝试运行vcvarsall.bat来配置一下VS的环境。这样发布出来的目录就带上了VS的依赖库,拷贝到没有安装VS的电脑上亦可以运行。
2. 资源文件 .qrc
需要我们给窗口设置图标
使用资源文件解决上述的弊端:
优势:
- 将图片资源放到资源文件
- 当程序编译的时候, 资源文件中的图片会被转换为二进制, 打包到exe中
- 直接发布exe就可以, 不需要额外提供图片资源了
在VS中使用资源文件,需要安装Vs的Qt插件,具体操作如下。
2.1.打开VS
选择菜单栏->扩展->管理扩展
2.VS安装Qt插件
选择菜单栏的 扩展->管理扩展,输入Qt搜索,然后下载Qt Visual Studio Tools(下载灰常的银杏,慢的死~还不一定能下载)
如果实在不能忍受这龟速,咱们来别的办法
先到Qt官网下载对于版本的插件,我这里是VS2022:
如果跳到如下页面,选择清华大学镜像源下载即可。
3.安装VSIX(即上面下载的那个插件)
如果是通过Vs下载的,会自动安装。
如果是手动下载的,需要双击自己安装。
打开安装包之后,点击Install等待安装完成即可。
安装之前,请先关掉Vs
没有关掉会出现如下界面,点击end tasks即可
关闭Vs之后,一秒安装完成
安装完成,关掉程序
附录一
- 此枚举类型用于为小部件指定各种窗口系统属性。 它们相当不寻常,但在少数情况下是必要的。 其中一些标志取决于底层窗口管理器是否支持它们。
枚举 | 值(十六进制) | 描述 |
Qt::Widget | 0x00000000 | 这是QWidget的默认类型。 这种类型的控件如果有父控件,则为控件,如果没有父控件,则为独立窗口。 |
Qt::Window | 0x00000001 | 指示小部件是一个窗口,通常带有窗口系统框架和标题栏,而不管小部件是否有父窗口。 |
Qt::Dialog | 0x00000002| Window | 指示小部件是一个窗口,应该装饰为一个对话框(即,通常在标题栏中没有最大化或最小化按钮)。 |
Qt::Sheet | 0x00000004| Window | 指示窗口是macOS上的工作表。 由于使用工作表意味着窗口模式,推荐的方法是使用QWidget::setWindowModality(),或QDialog::open() |
Qt::Drawer | Sheet | Dialog | 指示小部件是macOS上的一个抽屉 |
Qt::Popup | 0x00000008| Window | 指示小部件是弹出式顶级窗口,即它是模态窗口,但具有适合于弹出式菜单的窗口系统框架。 |
Qt::Tool | Popup | Dialog | 指示小部件是工具窗口。 工具窗口通常是一个小窗口,比通常的标题栏和装饰更小,通常用于工具按钮集合 |
Qt::ToolTip | Popup | Sheet | 指示小部件是一个工具提示。 这在内部用于实现工具提示 |
Qt::SplashScreen | ToolTip | Dialog | 表示该窗口为启动画面。 这是QSplashScreen的默认类型 |
Qt::Desktop | 0x00000010| Window | 指示此小部件是桌面。 这是QDesktopWidget(此类已经过时)的类型 |
Qt::SubWindow | 0x00000012 | 指示此小部件是子窗口,例如QMdiSubWindow小部件 |
Qt::ForeignWindow | 0x00000020| Window | 表示此窗口对象是一个句柄,表示由另一个进程或手动使用本机代码创建的本机平台窗口。 |
Qt::CoverWindow | 0x00000040| Window | 指示该窗口表示覆盖窗口,该窗口在某些平台上最小化应用程序时显示。 |
- 窗口提示可以有多个(不一定会生效,看平台是否支持)
枚举 | 值(十六进制) | 描述 |
Qt::FramelessWindowHint | 0x00000800 | 窗口无边框 |
Qt::NoDropShadowWindowHint | 0x40000000 | 去掉窗口阴影 |
Qt::CustomizeWindowHint | 0x02000000 | 关闭默认的窗口标题提示 |
Qt::WindowTitleHint | 0x00001000 | 给窗口一个标题栏 |
Qt::WindowSystemMenuHint | 0x00002000 | 添加一个窗口系统菜单,可能还有一个关闭按钮(例如在Mac上)。 如果你需要隐藏或显示关闭按钮,使用WindowCloseButtonHint更便于移植。 |
Qt::WindowMinimizeButtonHint | 0x00004000 | 激活最小化和关闭按钮,禁止最大化按钮 |
Qt::WindowMaximizeButtonHint | 0x00008000 | 激活最大化和关闭按钮,禁止最小化按钮 |
Qt::WindowMinMaxButtonsHint | WindowMinimizeButtonHint |WindowMaximizeButtonHint | 激活最小化,最大化和关闭按钮 |
Qt::WindowCloseButtonHint | 0x08000000 | 添加一个关闭按钮 |
Qt::WindowContextHelpButtonHint | 0x00010000 | 添加问号和关闭按钮,同对话框 |
Qt::WindowStaysOnTopHint | 0x00040000 | 窗口顶置 |
Qt::WindowStaysOnBottomHint | 0x04000000 | 窗口底置 |
附录二
- 窗口状态
Qt::WindowState
枚举 | 值 | 描述 |
Qt::WindowNoState | 0x00000000 | 窗口没有状态设置(正常状态) |
Qt::WindowMinimized | 0x00000001 | 窗口被最小化(即图标化) |
Qt::WindowMaximized | 0x00000002 | 窗户周围有一个框架,使其最大化 |
Qt::WindowFullScreen | 0x00000004 | 窗口填充了整个屏幕,周围没有任何边框 |
Qt::WindowActive | 0x00000008 | 该窗口是活动窗口,即它有键盘焦点 |
- 作者:Yuleo
- 链接:https://www.helloylh.com/6bb4659c19c24b05bc397198baa93475
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。