(1)类定义中的【Q_OBJECT】
如果一个类要使用信号/槽功能,就必须在其中声明Q_OBJECT。
(2)explicit C++ explicit关键字详解
在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显式的方式进行类型转换。
explicit使用注意事项: explicit 关键字只能用于类内部的构造函数声明上。 explicit 关键字作用于单个参数的构造函数。
(3)Qt构造函数的参数:QObject *parent = 0 Qt构造函数的参数:QObject *parent = Q_NULLPTR
(4)友元函数和友元类详解 友元函数和友元类详解
(5)Qt之信号signals和槽slots详解 Qt之信号signals和槽slots详解
(6)release下屏蔽qDebug()语句的输出:pro文件中添加
release:DEFINES += QT_NO_WARNING_OUTPUT\
QT_NO_DEBUG_OUTPUT
添加完成后,必须clear项目然后重新编译。
(7)cout与cin的使用(信息打印到【应用程序输出窗口】):增加 #include <iostream>;再通过std::cout<< 与 std::cin<< 就可以了。
(8)SQLite的sqlite_master表 摘录于SQLite的sqlite_master表
sqlite_master表是SQLite的系统表。该表记录该数据库中保存的表、索引、视图、和触发器信息。每一行记录一个项目。在创建一个SQLIte数据库的时候,该表会自动创建。sqlite_master表包含5列。
type列记录了项目的类型,如table、index、view、trigger。
name列记录了项目的名称,如表名、索引名等。
tbl_name列记录所从属的表名,如索引所在的表名。对于表来说,该列就是表名本身。
rootpage列记录项目在数据库页中存储的编号。对于视图和触发器,该列值为0或者NULL。
sql列记录创建该项目的SQL语句。
由于sqlite_master表存储所有的数据库项目,所以可以通过该表判断特定的表、视图或者索引是否存在。例如,以下语句可以判断user表是否存在:select count(*) from sqlite_master where name='user' and type='table'
(9)C++ 允许多继承,即一个子类可以有多个父类,它继承了多个父类的特性。
C# 一个类只允许有一个父类,但它可以同时实现若干个接口。
(10)C++中的.hpp文件 c++中的.hpp文件
hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译。
而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,
采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。
特点:
1)、是Header Plus Plus 的简写。
2)、与*.h类似,hpp是C++程序头文件 。
3)、是VCL 专用的头文件,已预编译。
4)、是一般模板类的头文件。
5)、一般来说,*.h里面只有声明,没有实现,而*.hpp里声明实现都有,后者可以减 少.cpp的数量。
6)、*.h里面可以有using namespace std,而*.hpp里则无。
(11)C++ 序列容器
模板 | 头文件 | 说明 | 特点 |
---|---|---|---|
vector<T> | vector | 创建一个表示存储T类型对象的动态数组的类 | 在末尾插入和删除;随机访问内容 |
list<T> | list | 创建一个表示存储T类型对象的链表的类 | 在任意位置插入,删除任意对象;不能进行随机访问,只能按顺序访问。 |
deque<T> | deque | 创建一个表示存储T类型对象的双端队列的类 | 在末尾或开头插入和删除;随机访问内容 |
关联容器 深度解析QMap与QHash
(12)QT中foreach的使用 QT中foreach的使用
(13)打印char类型数组
#include <iostream>
// 打印 test_char 正确的方式
char test_char[2] = {0x01, 0x02};
std::cout<<"send data:"<<QByteArray::fromRawData(test_char, 2).toHex(',').data()<<std::endl; // 打印的结果:send data:01,02
// 错误的方式(打印出的是字符的ascii码,还得在【test_char】结尾处增加字符串结尾0x00)
std::cout<<test_char<<std::endl;
(14) #pragma once 与#ifndef的区别 #pragma once与 #ifndef的区别
目的:避免同一个文件被include多次
(15)Qt Creator【一打开就无响应】或【无法输入,输入按Insert,才能输入】的可能解决方法
删除~\AppData\Roaming\QtProject文件夹,然后再打开Qt Creator即可。
Linux下,~是/home/YourUserName
Windows下,~是C:\Users\YourUserName