auto基础
当变量不是指针或者引用类型时,推导的结果中不会保留 const、volatile 关键字
当变量是指针或者引用类型时,推导的结果中会保留 const、volatile 关键字
很好理解,指针或者引用表示对内存那个位置的数操作,那么有 const 表示对那块区域的内存值不能修改,那么推导后 const 关键字就该保留
12345678910111213auto b; // 错误,需要初始化int temp = 110;auto *a = &temp; // a 为 int* auto ---> intauto b = &temp; // b 为 int* auto ---> int*auto &c = temp; // c 为 int auto ---> intauto d = temp; // d 为 int auto ---> intint tmp = 250; const auto a1 = tmp; // a1 为 const intauto a2 = a1; ...
右值引用
左值是指存储在内存中、有明确存储地址(可取地址)的数据 右值是指可以提供数据值的数据(不可取地址)
右值和左值形式12345678910111213141516171819// 左值int num = 10;// 左值引用int &a = num;// 右值引用int &&b = 10;int &&p = b; // 错误// 常量左值引用const int &c = num;const int &g = 10;const int &g1 = a;int &t = c; // 错误// 常量右值引用const int &&d = 10;// 常量左值引用const int &g2 = d;const int &g3 = b;const int &&e = b; // 错误const int &&f = d; // 错误
右值引用
简单来说就是夺舍,就是把临时对象的空间占据,成为管 ...
绘图事件
绘图事件重写的情景
当你需要创建一个自定义控件,并且这个控件需要显示特殊的图形、颜色或形状时,重写 paintEvent 是必要的。例如,如果你需要绘制一个自定义的进度条、按钮、图表等
当你需要在窗口中绘制复杂的图形,或者在应用程序中实现动画时,paintEvent 可以用来每次刷新窗口内容
示例
首先需要在窗口的头文件声明这方法,表示要重写
然后书写具体规则
12345678910111213141516171819202122232425262728void MainWindow::paintEvent(QPaintEvent *) { // 实例化画家对象 this 指定的是绘图设备 QPainter painter(this); // 设置画笔 QPen pen(QColor(255,0,0)); // 设置画笔宽度 pen.setWidth(3); // 设置画笔风格 pen.setStyle(Qt::DotLine); // 让画家 使用这个笔 painter.setPen(pen) ...
Item WidgetsQListWidget1234567891011121314MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow){ ui->setupUi(this); QListWidgetItem*item = new QListWidgetItem("悯农"); ui->listwidget->addItem(item); item->setTextAlignment(Qt::AlignHCenter); QStringList list; list << "锄禾日当午" << "汗滴禾下土" << "谁知盘中餐" << "粒粒皆辛苦"; ui->listwidget->addItems(list); ...
概述
信号
信号的本质就是事件
按钮单击、双击
窗口刷新
鼠标移动、鼠标按下、鼠标释放
键盘输入
信号的呈现形式就是函数, 也就是说某个事件产生了, Qt 框架就会调用某个对应的信号函数, 通知使用者
信号的发出者是某个实例化的类对象,对象内部可以进行相关事件的检测
槽
本质是一个函数,是一个对信号做处理的一个函数,就是信号发送给当前接受方,接收方需要干什么
槽函数的所有者也是某个类的实例对象,很好理解,对象就是知指明是谁去执行这个槽函数,就是接收方,而不是所有的对象都能执行
信号和槽的关系
也就是上述所说,需要指定接收方,而 QT 框架并不知道信号所对应的接收方是谁,这时候我们需要手动连接双方,告诉编译器发送方是谁,发送的什么信号,接收方是谁,接收方收到信号后干什么
相当于注册功能
1234567891011// 参数 signal 和 method 都是函数地址, 因此简化之后的 connect() 如下:connect(const QObject *sender, &QObject::signal, const QObject ...
QT 概述
模块
功能
Qt Core
Qt 类库的核心,所有其他模块都依赖于此模块
Qt GUI
设计 GUI 界面的基础类,包括 OpenGL
Qt Widgets
用于构建 GUI 界面的 C++ 图形组件类
创建一个项目都会自动添加上述模块
注意点
QtCreator 创建的 项目名称 不能包含中文,不能包含空格,项目目录 也不能含中文
QtCreator 默认使用 UTF-8 格式编码对文件字符进行编码
创建项目创建完后的
项目文件(. pro)1234567891011121314151617181920212223242526# 在项目文件中, 注释需要使用 井号(#)# 项目编译的时候需要加载哪些底层模块QT += core gui # 如果当前Qt版本大于4, 会添加一个额外的模块: widgets# Qt 5中对gui模块进行了拆分, 将 widgets 独立出来了greaterThan(QT_MAJOR_VERSION, 4): QT += widgets # 使用c++11新特性CONFIG += c++11 ...
Python
未读
输入输出1234a = "hh"a = 1.1a = 2print(a)
格式化1234a = 1.1print("%s" % a) 1.1print("%.2f" % a) 1.1print("%f" % a) 1.100000
快速格式化
语法:
f " 内容 { 变量 } " 的格式来快速格式化
示例:
1234name = "张三" price = 11.12 year = 34 print(f"我是{name},今年{year},这个价格是{price}")
123456print("请输入")name = input()与name = input("请输入")等效
注意:
input 语句输入默认为字符串类型
要用其他类型需要强制转换
int() 、str()、float()
语 ...
注意点
通配符和正则表达式不同 特别是 * 这个符号 通配符:零到无限多个字符的意思 正则表达式:重复零到无限多个前一个字符的意思
${name} 取出变量结果 $(date) 在括号中执行命令,然后读取出命令结果,拿到它 `` 和上一个类似 $name 取出变量结果
1echo "今天日期:$(date)"
数值计算
shell 的一些基础命令,只支持整数的运算,小数的计算需要如 bc 这样的命令
(( ))1234567891011echo $((3 + 4)) # 7echo $((10 / 3)) # 3echo $((5 ** 2)) # 25echo $((3 < 4 && 5 == 5)) # 1echo $((2 * 1.5)) # 报错num=5echo $((num = num * 3)) # 15echo $num # 15b=$((num = num * 3)) # b = 15echo $((b++))
let
效果等同于双括号 效率更低一点
123num=8num=num+2 ...
同步线程池
温馨提示:需要的前置知识:C++多线程 https://xingzhu.top/archives/duo-xian-cheng-xian-cheng-chiC++11新特性(分类里面有)
threadpool. h
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556#include <thread> #include <map> #include <queue> #include <functional> #include <atomic> #include <future> #include <condition_variable> #include <vector> #include <mutex> using namespace std; class ThreadPool ...
Linux
未读
这是 C 语言版的,C++ 版 https://xingzhu.top/archives/duo-xian-cheng-xian-cheng-chi
线程基础
进程有自己独立的地址空间,多个线程共用同一个地址空间
线程是程序的最小执行单位,进程是操作系统中最小的资源分配单位
CPU 划分时间片,多个线程抢占时间片执行
线程的上下文切换比进程要快的多
上下文切换是指继续上次线程没执行完的部分,接着执行后续的操作
Linux 看来,线程就是轻量版的进程,但是 Windows 不是这样的
父线程创建的子线程,子线程之间共享堆区、全局区、代码区,但是栈区和寄存器是各自独有
线程基本函数
在一个 main 函数中,是一个进程,此时创建线程后,这个进程变为了父线程和子线程
创建线程1pthread_t pthread_self(void); // 返回当前线程的线程ID
这个 ID 是一个无符号长整型形数
1234#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t ...