简截代码结构
工具及基础本软件使用qt5.9.9。IDE推荐qt自带的qtcreater,它的帮助是真的好用,可以节省大量的查阅资料时间。
左边是代码,在insert上按F1即可出现右边帮助
qt基础需要了解qt元对象系统、qt信号槽系统和qt内存管理。
信号槽信号槽是qt特有的信号传递方式。在子类和父类之间如何进行信号传递呢?
父类和子类相互引用父类与子类相互引用解决方法
定义接口定义子类需要使用的接口并且由父类实现,并且把父类的指针以接口的形式传递给子类。这样子类就可以使用父类的部分函数。这样避免了相互引用但是容易引起代码结构混乱,本代码中new_capture/Widgets/Ipoint_position_change就是使用这种思想
使用信号槽
信号槽可以理解为第二种方法,只是qt在后台帮我们生成了许多代码。它首先需要定义一个信号,然后再适当的时机抛出这个信号,然后等待其他代码接收。
发出信号#ifndef LIST_ITEM_H#define LIST_ITEM_H#include<QWidget>#include<QLineEdit>#include< ...
DOM
简介DOM(文档对象模型)是HTML和XML的编程接口,可以通过它查找和修改每一个节点的属性。DOM的表现形式类似于一棵树
document节点是每个文档的根节点,而html是它唯一的子节点,其他元素都在这个文档内。总共有12中类型的节点。这些节点统一由Node定义。
Node.nodeType:定义了节点的类型,总共有十二种类型
Node.ELEMENT_NODE(1): 元素,如html,head等
Node.ATTRIBUTE_NODE(2): 属性,例如图中的href
Node.TEXT_NODE(3): 元素中间的文本
Node.CDATA_SECTION_NODE(4)
Node.ENTITY_REFERENCE_NODE(5)
Node.ENTITY_NODE(6)
Node.PROCESSING_INSTRUCTION_NODE(7)
Node.COMMENT_NODE(8)
Node.DOCUMENT_NODE(9)
Node.DOCUMENT_TYPE_NODE(10)
Node.DOCUMENT_FRAGMENT_NODE(11)
Node.NOTATION_ ...
css选择器
概述选择器是用来快速便捷的查找某一元素的,一个html文档中这么多元素,属性,如果只使用获得某一元素然后遍历再获得子元素的方法那时不可想象的,可能随便查找一个元素都需要几十行代码。
而选择器就是为了简化查找操作的。他将几种常用的标签作为选择的key,只需要知道这些标签内部就会有一套算法帮助我们快速查找,并且还可以几个key连在一起查找。
选择器种类*(清空) #(ID) .(类)*(清空选择器)
这个选择器会选择所有元素,常被用作清空margin和padding
*{ margin: 0; padding: 0;}
#(ID选择器)
它会选择所有匹配的ID
例如<div id="gac_scont"></div>css#gac_scont{ border: 1px solid black;}
.(类选择器)
类选择器会选择对应的类,例如<div class="DH7hPe"></div>css.DH7hPe{ color: re ...
c++ 两个类互相引用
两个类互相引用如#include "b.h"class A{public: A(); void get_data(); void print_b();private: B b; int sum;}---------------------b.h#include "a.h"class B{public: B(); int get_data(); void print_A();private: A a; int sum;}
可以看看上面的过程。加入首先发现a.h,然后根据a.h把b.h拖进来,然后b.h又把a.h拖进来,此时a.h包含a.h和b.h的内容,也就是说b.h定义了两次,因此会报错。
我们可以使用声明提前的方法解决这个问题#ifndef _A_H#define _A_H#include "b.h"class A{public: A(); void get_data(); void print_b ...
BOM
window对象window对象在浏览器中有两重身份,一是Global对象,而是浏览器窗口的js接口。网页中定义的所有对象,变量都可以以window作为Global对象,并且使用parseInt()等方法。
使用var会自动添加到全局对象中。而使用let则不会。window对象还可以用来查询是否存在未声明的变量
var temp = 1;console.log(window.temp);//全局对象加入window中var newValue = oldValue;//报错var newValue = window.oldValue;//这里是属性查询,因此newValue会被设置为undefined而不会报错
窗口操作函数window.self始终指向window本身,window.top始终指向浏览器窗口本身,而window.parent始终指向当前窗口的父窗口,如果本身就是最上层窗口,那么window.parent和window.top相同
window.moveTo(x, y): 将左上角移动到对应位置
window.moveBy(dx, dy): 从当前位置移动若干像素
窗 ...
qt 选择器
qt的选择器中共有
通用选择器(*): 作用于所有widget
类型选择器: 作用于该类及子类
类选择器: 只作用于这个类
ID选择器: 作用于某个对象
属性选择器: 作用域某个成员变量
包含选择器: 作用于某个类下的类
子元素选择器: 作用于某个类的直接子widget
伪类选择器: 选择某些状态,如QPushButton的hover和pressed状态
子控件选择器: 选择某个部件下面的子部件
qss内部数属性一般是不区分大小写的,但是类名,属性名区分大小写
加载方法QFile qss("StyleSheet.qss");qss.open(QFile::ReadOnly);app.setStyleSheet(qss.readAll());qss.close();
类型、类、ID选择器类型选择器
格式className{ attribute: value; ...}其中attribute是控件的各种属性,className是类名,由QObject::metaObject()::className获得。类型选择器匹配该类及其派生类
...
js 代理和反射
代理基础代理是目标对象的抽象。代理类似于c++的指针,可以通过代理操作对象,但是它又是一个独立的变量。在代理上的修改会反映到目标对象上,在目标对象上的修改也会对代理起作用
创建
const target = { id: 'target'};const handler = {};const proxy = new Proxy(target, handler);//两个参数,第一个是操作的对象,第二个是处理程序对象,用来定义捕获器console.log(proxy.id);//target可以通过revocable()定义撤销代理,并且还可以通过一个返回值进行撤销,撤销完成后再使用代理会产生异常const target = {foo: 'bar'};const handler = { get(){ return 'intercepted';}};const {proxy, revoke} = Proxy.r ...
js函数
基础在js中,函数其实是对象。每个函数都是Function类型的实例,Function也有自己的属性和方法。因为函数是对象,所以函数名其实就是指向对象的指针,甚至和这个对象没有强制绑定。
定义函数的一些方式:
直接定义function sum(num1, num2){ return num1 + num2;}
匿名定义,定义一个函数,然后把函数指针给sum变量let sum = function(num1, num2){ return num1 + num2;};
通过箭头,可以称作箭头函数。这是一种语法糖,实际上和上面那个作用是一样的let sum (num1, num2) => { return num1 + num2;};
箭头函数可以用在任何使用函数表达式的地方(不需要函数名的地方),但是箭头函数和普通函数还是有一些微妙的差别的,例如不能使用arguments等。
最后一种方法时使用Function构造函数,这个函数接收任意多个参数,最后一个参数会被当成函数体,例如let sum = new Func ...
js迭代器和生成器
迭代器在很多语言中都有迭代器,例如QList<int>::iterator iter = list.begin();while(iter != list.end()){ iter = iter->next();}在js中let set = new Set().add(3).add(1).add(4)
通过上面的例子可以看出,迭代器的关键是不断返回一个相同类型的不同实例。在js中,实现Iterable接口就可以认为是一个迭代器。迭代器是按需创建的一次性对象,每个迭代器都会关联一个可迭代对象,而迭代器会暴露迭代其关联对象的API(例如next)
实现Iterator接口需要实现两种能力: 自我识别能力和创建实现Iterator接口的对象的能力。这意味着需要暴露一个属性作为默认迭代器,并且这个属性还要以Symbol.iterator作为键。默认迭代器必须引用一个迭代器工厂函数,调用这个工厂函数必须返回一个新迭代器。
常见的实现了Iterator接口的类:字符串、数组、map、set、arguments、NodeList
可以使用for-of循环、数 ...
js常用对象
基本引用类型DateDate和java的Date类似,里面保存的是从1970年1月1日至今的毫秒数。
创建
Date(date): 创建一个Date对象,包含创建时的时间.date是字符串形式的时间,格式可以参照parse()的格式
Date.now(): 返回当前时间的毫秒数
Date.parse(): 将其他格式的时间字符串转换为该日期的毫秒数,例如let someDate = new Date(Date.parse("May 23, 2019"));
可以使用下列格式
月/日/年: 如”5/23/2019”
月名 日, 年: 如”May 23, 2019”
周几 月名 日 年 时:分:秒:时区,如”Tue May 23 2019 00:00:00 GMT-0700”
YYYY-MM-DDTHH:mm:ss:sssZ,如”2019-05-23T00:00:00
Date.UTC(year, month, day, hour, minute, second):传入年、月(0-11)、日(1-31)、时(0-23)、分、秒并转化为毫秒数,如let y2k = ...