C++ 11 函数适配器 bind
参考博客:
C++11新特性:参数绑定——std::bind - 莫水千流 - 博客园 (cnblogs.com)
【C++】C++11的std::function和std::bind用法详解_c++11 新增了 std::function、std::bind-CSDN博客
enum class
我们在 C++
中常使用 enum
来给同一类别中的多个值命名,如:给颜色中的 0, 1, 2, 3, ...
值命名,可以用下面的写法:
1 | enum Color { |
C++
的 C98
标准称 enum
为不限范围的枚举型别。因为 C++
中的枚举量会泄露到包含这个枚举类型的作用域内,在这个作用域内就不能有其他实体取相同的名字。我们可以通过一段代码来演示这一现象:
1 |
|
当我们编译时,会出现重定义错误:error: 'auto GRAY' redeclared as different kind of entity
。
为了解决这一问题,C++ 11
新标准提供了 enum Class
枚举类。对于上面的代码,我们再一次做出演示:
1 |
|
此时,输出 3
和 10
。可以看到在全局作用域的 GRAY
被赋值成了 10
,而枚举类中的 GRAY
还是 3
,且必须使用作用域限定符进行访问。 这里可以看到我使用了一个 static_cast<int> (Color::GRAY)
进行了一个强制类型转换,这是因为 enum
不支持隐式类型转换。如果想要进行转换,则必须使用 static_cast
进行强制类型转换。
[TOC]
GameObject
的概念。GameObject
的范畴。他们接受着不同的场景剧本的指挥,进行着不同逻辑的演出。Scene
场景基类,主菜单、角色选择、局内游戏 作为新类分别继承 Scene
类。1 | 初始化(); |
A.h
,有一个头文件 B.h
,头文件 B.h
中使用了 A.h
的内容。当我们在主函数里面使用了 A.h
和 B.h
的时候,使用 #include
时会将头文件中的内容全部复制到 #include
的部分。这样的话如果不加头文件卫士,就会导致重定义的问题,如下: 1 | // A.h |
MSVC
编译器中,头文件卫士如下: 1 |
1 |
游戏程序是一个巨大的死循环,也是一个巨大的状态机。不同的游戏场景代表着不同的状态,管理着这些状态的“状态机”,在游戏开发中有一个特殊的名字——场景管理器。
[TOC]
Ctrl + Tab
可以切换文件;Alt + ENTER
弹出代码生成提示,可以快速提示错误修改方案,类似于 IDEA 的 Alt + ENTER
;Alt + 鼠标
同时输入;Ctrl + R
运行程序;Ctrl + M
创建书签(Bookmark),或者直接在某行代码前右键添加书签;Ctrl + ENTER
在当前行下方插入空行;Ctrl + Shift + ENTER
在当前行下方插入空行;Ctrl + I
代码对齐;Ctrl + ;
格式化代码;Shift + Delete
剪切当前行,可以当删除用;Ctrl + Shift + R
局部变量统一修改;Ctrl + Shift + V
复制历史;功能键 | 方向键 | 备注 | ||||
Ctrl | Shift | Alt | 左/右 | 上/下 | Home/End | 方向键具有移动光标的作用 |
× | × | × | 字符 | 字符 | 行首/行尾 | - |
√ | × | × | 单词 | 滚动条 | 文件头/尾 | - |
√ | √ | × | 单词 | 移动 | 行首/行尾 | Shift具有选中文本的作用 |
√ | × | √ | - | 向上/下复制选中部分 | - | - |
F1
查看帮助、文档F2
快速到变量或者函数间切换F4
快速在.cpp
文件和.h
文件间切换Ctrl + Shift + U
查找所有使用该符号的地方Ctrl + K
打开定位器Ctrl + L
跳转到某一行Ctrl + [Shift] + F
查找/替换当前文件[项目]当前选中的内容[Shift] + F3
查找下[上]一个Ctrl + B
编译工程Ctrl + R
运行工程F5
调试运行Ctrl + Shift + F5
重启调试F9
设置和取消断点F10
单步跳过F11
单步进入片段简单理解一下就是已经写好的一些模式化的代码,用户可以使用内置片段或者根据自己的需要自定义片段。
note
,用来表示文件注释,可以选择 Group
为 C++
,然后选择 Add
,添加指定的内容:Qt的源代码和文件解释
hellocosbrowser.h
1 |
|
文件列表
文件名称 | 描述 |
---|---|
pro 文件 |
该文件是 Qt 的项目文件,qmake工具可以根据此文件生成 Makefile |
pro.user 文件 |
该文件包含和用户相关的项目信息(用户不需要关注此文件) |
ui 文件 |
Qt 的设计师界面文件 |
.cpp 文件 |
C++ 源文件 |
.h 文件 |
C++ 头文件 |
MOC(Meta-Object Compiler)编译器
C++ 编译器本身不支持 Qt 的某些机制,Qt 希望对 C++ 代码进行自动扩展,这里就需要用到宏(例如:Q_Object
)和继承。
此外为了方便用户使用,希望用户无感知,可以将这一操作直接集成到框架中。
1 | 预编译 -> 编译 -> 汇编 -> 链接 -> 目标 |
通过上述方式,实现 Qt 的某些特性。我们可以发现,当我们写完代码进行编译后,会产生一个 debug
文件夹,此时我们进入该文件夹,会看到一些元对象编译器编译的文件,如 moc_xxxx.cpp
或 moc_xxx.h
等文件。
Q_OBJECT
宏Q_OBJECT
宏。
① Qt 控件编辑模式
② Qt 信号与槽编辑模式
③ Qt 伙伴关系编辑模式
④ Qt Tab 顺序编辑模式:可以设置按下 Tab 键的高亮顺序
信号与槽的基本概念
emit
关键字发送信号传递参数。QObject
类或其派生类,同时包含 Q_OBJECT
宏signals
声明函数信号函数,不需要具体实现信号函数emit
关键字发送信号Q_OBJECT
宏[public/protected/private] slots
声明函数SIGNAL/SLOT
宏写法:QObject::connect(this, SIGNAL(...), this, SLOT(...));
QObject::connect(this, &SignalFunction, this, &SlotFunction)
QObject::connect(this, &SignalFunction, this, [=]() { qDebug() << "..."; })
三种写法的比较:
连接信号与槽 | 宏 | 函数指针 | ||||
编译 | 运行 | 编译 | 运行 | |||
参数类型 | 完全相同 | √ | √ | √ | √ | |
隐式转换 | 向上 | √ | × | √ | √ | |
向下 | √ | × | √ | √ | ||
不可以隐式转换 | √ | × | × | × | ||
参数个数 | 信号=槽 | √ | √ | √ | √ | |
信号>槽 | √ | √ | √ | √ | ||
信号<槽 | √ | × | × | × |
static_cast<void QSpinBox::*)(int)>
。void on_<对象名>_<信号名>(信号参数);
时可以不使用 connect
进行连接,但是当对象名、信号名或参数发生变化时,连接将会失效,且编译不会有错误提示。顶层窗口、次级窗口(父、子窗口)
在该图中,①可以称为顶层窗口(父窗口),②可以称为次级窗口(子窗口)。窗口中的某些按钮、输入框…等就是控件。
在 Qt 中可以使用 setWindowFlags()
来设置窗口标志
设置窗口无标题栏
1 | this->setWindowFlags(Qt::CustomizeWindowHint); |
设置窗口无边框
1 | setWindowFlags(Qt::FramelessWindowHint); |
设置窗口置顶
1 | setWindowFlags(Qt::WindowStaysOnTopHint); |
如果按照上述方式依次设置窗口标志,我们会发现当设置第 $3$ 步时前面两步的操作都失效了,这是因为设置窗口置顶时,会覆盖前面的设置。我们可以使用“或”符连接这些标志,解决这一问题:
1 | setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); |
setWindowIcon
方法logo.ico
RC_ICONS = <Path>
.exe
的图标会修改,且不需要额外单独设置窗口图标。手动部署(不常用,比较繁琐)
进入 .exe
文件所在的文件夹(debug
目录),双击运行 .exe
文件,会提示缺少的文件(包括dll
动态库、plugin
插件等),然后找到对应的文件移动到 .exe
文件的同级目录下即可,如下:
如果配置了环境变量则大概率不会出现报错提示缺少库的问题,那么这种方式就会失效。
使用 windeployqt 部署
① 查找 windeployqt.exe
程序
② 将 windeployqt.exe
加入环境变量
③ 再命令行界面执行命令 windeployqt.exe <exe_file_dir>
完成操作
使用creator 部署
① 项目导航窗口→运行→部署→添加自定义部署
② 输入 windeployqt.exe
程序及对应的命令行参数
③ 执行部署命令
官方文档:Qt 6.7
一个不错的 Qt 中文文档:Qt 中文文档 5.15.1 版本
QLabel
标签控件QLabel
的本质其实就是显示数据。其可以显示文本数据、图片数据。
了解了这些我们再来看 QLabel
的一些常用属性:
属性 | 说明 |
---|---|
text : QString |
文本内容:纯文本 |
openExternalLinks :bool |
文本内容:超链接 |
textFormat : Qt::TextFormat |
文本内容:不同类型的文本,如富文本等 |
alignment : Qt::Alignment |
文本格式:对齐方式 |
indent : int |
文本格式:缩进 |
margin : int |
文本格式:边距 |
wordWrap : bool |
文本格式:换行 |
pixmap : QPixmap |
图片内容:显示图片 |
hasSelectedText : const bool |
方法:文本是否被选中 |
scaledContents : bool |
方法:是否缩放内容 |
selectedText : const QString |
方法:获取选中的内容 |
textInteractionFlags : Qt::TextInteractionFlags |
方法:指定标签应如何与用户输入交互,若它显示文本 |
QLineEdit
单行输入框控件QLineEdit
的本质是用于不确定的输入,如用户的手机号、用户的密码。这样就给了用户一定的自由,但是我们同时需要制定一系列的规则,以校验用户的输入。例如用户输入手机号,我们需要制定一个长度为 11
位的规则,并且输入字符中不包含字母等,以方便开发人员进行校验。当然我们也可以配合一些其他操作来优化用户体验,如:清空(如:快速清空内容)、提示(如:提示输入格式)、记忆(如:记忆之前的输入)等。
了解了这些我们可以看一下 QLineEdit
的一些常用属性(不完全,具体还是需要看文档):
属性 | 说明 |
---|---|
clearButtonEnabled : bool |
清空文本框内容 该属性保存行编辑不为空时是否显示清除按钮。 |
placeholderText : QString |
占位符文本,可以用于提示输入内容。 |
inputMask : QString |
掩码 |