@TODO(trivial)
QTimer::single( 1000, ??)
普通函数里 也可以写她 (参见TemporyInfo
);
但connect
她必须在Q_OBJECT
修饰的类的成员函数里, 否则不行;
lable如何不继承(默认)使用父类的样式表;
QDebug重定向 (有一些系统bug会输出);
顶层widget 她的·border`设置后 依然是有的;
@DELI;
A.widget里面有个 PlainTextEdit, 然后installEventFilter(textEdit);
会发现: 这个textEdit发生的一切事件 其实你widget是捕获不到的;比如ctrl+C;
`.` 因此使用SetFocus就很重要了, 这样他就不会捕获了;
@DELI;
QWidget::childAt( QCursor::pos());
滚轮滑动时事件, 点击不是Wheel事件, 应该时click?
@TODO: 懒标记Lazy, 应该可以写成模板, 即operator+
;
其实, 前缀和|差分 与 区间和查询|区间累加修改, 没有关系!!!
前缀和和差分 他俩是互为逆操作的, 前缀和的目的 就只是构造出来即可; 差分的目的 也只在于能构造出差分数组即可;
任意维度的差分;
hide != minimal
@DELI;
令: ToString是只有声明无实现;
void F( int _a){
if( 0){
ToString(0);
}
} 此时编译没事, 说明编译器把`if(0)`给优化掉了
但是:
if( _a == -1){ // 即使你保证他一定为false, 还是错误;
ToString(0);
}
因此, 只要出现的extern 你必须有实现, 不要放一个空壳子;
@DELI;
重复的执行这句话: conn = connect(..){ }; 不要以为 这个`connect`每次都是一个新的东西, 不是的;
这个conn确实每次是新对象, 但connect他是*Lambda*函数 他是静态的! 即在编译期就确定了的;
比如, connect里面有个static变量A, 那么你连接多少次 他们都对应的同一个;
unordered_map<TYPE_::Double_,string>;
不能用, 即使加了hash<>·;
为啥啊不能给QProcess, exe->setProperty( "testID", QVariant( _testID))
, 返回值是0, 不能加动态类型?
A有纯虚函数, 但是 A的析构函数 不可以纯虚 而是虚函数;
子类的先析构 然后是父类析构; 子类可以没有析构函数;
A.h: class ST{ T * p};
A.h和B.h 相互包含, 会出错把, 即有2个class ST{};声明; 虽然extern 是可以的;
所以 为什么成员变量是Ui * ui, 而不是Ui ui; 因为这样 不用包含头文件;
但他有个缺点, B.cpp即使`include A.h`, 他也找不到`p->`里面的东西 (参见Ui);
@DELI;
只要有纯虚函数, 他是抽象类 不可以有对象的, 因此你构造函数写不写没事, 但析构必须些;
`.` 虽然这样, 但抽象类里有函数实现是合理的, 因为如果子类不实现 就默认用父类的; (Task_::SetStatus)
虚函数继承, 他并不会自动调用父类的虚函数, 你需要手动调用;
抽象类些构造函数, 那么子类必须重写 (参见Task);
@DELI;
成员变量 ST t; 此时ST不能是声明 class ST, 必须是定义 即#include;
@DELI;
特化的类、函数, 都必须在 命名空间里, 不可以在类里;
explicit specialization in non-namespace scope
@DELI;
我给你一个东西T, 他要么是编译操作, 要么是类型, 你怎么判断呢? (参见`___Modulo_::Power`);
如果你直接`T`(比如就一行代码`int`),此时是可以的, 但有个问题 他会有警告(因为`warning: declaration does not declare anything`)
目前做法是`T()` 构造一个对象, 因为在本场景中 `T`是个空类 效率应该不差的;
@DELI;
不同模板的类, 就是不同的类, 他们的static不是公用的
@DELI;
template< int _D> struct ST{
static void F(){
static bool v = 0;
if( v == 1){ return;}
v = 1;
DE_(11);
}
void Init(){
F();
}
};
ST<1>的所有对象 不管调用多少次INit(), 最终`F()`只会执行1次;
但是 一旦又`ST<2>`, 那么 他的`F()` 与 `ST<1>::F()`就不是一个;
@DELI;
数据库 必须有id, 这是唯一的标识一条记录;
@DELI;
不必选择最优算法 因为他可能会很复杂 即写代码; @LINK:
typedef/using 相当于是宏定义;
比如 using T = int; 则ST<T>会进入ST<int>的特化;
class Int128, 这样可以直接构造`Int128 a(1e30)`;
template<> struct numeric_limits<___Supimo_Algorithm::Double> : public numeric_limits<___Supimo_Algorithm::Double::__Type>{};
自己继承自己的特化(不能本身);
@DELI;
QT里 #include "./", `.`表示`.pro`文件 (而不是当前文件的位置)
当然 你使用#include "xx.h" (他是当前文件的);
@DELI;
求max/min, 如果用`O(N)`做法 即维护`ma,mi`, 他有个缺点 即你需要初始化他俩;
而使用`multiset` 很方便, 不用初始化;
你的代码里 访问*源文件* 是错误的; 因为exe运行起来, 就没有源文件了, 比如客户端;
@DELI;
QT的所有文件名 就是`.o`的名字 (跟目录无关), 即*/a.cpp是会冲突的;
@DELI;
QDebug<<重载 不能加引用, 因为标准库里 比如QDir 你就按照人家的写法;
qDebug().noquote() 不会加`\转义`, 否则 会加; 你可以测试`qDebug()<< __FILE__`;
#define A(_a) // _a不可以有逗号? A( pair<int,int>); 对的, 即使`A( (...) )`也不行;
解决: us
@DELI;
MOD_ == 0, 不行?
@DELI;
int main(){
Widge w0, w1;
}
即使你展示很很多窗口, 他还是一个*进程*;
@DELI;
宏定义: `AaaBbbCcc_`不要用驼峰, 而是用`AAAbbbCCC_`;
@DELI;
template<T> void F( T);
template<> void F<int>( int); // 优先级低
void F(int); // 优先级高
.. 但是 `template< T> void F< set<t> >, 是错误的, 函数不支持特化;
@DELI;
@DELI;
T * ptr = &A;
connect( ptr, ...); // 这个函数绑定的 是`A`把? 不是B; 研究一个对象析构 他的connect会启动清除把;
ptr = &B;
FOR_( id, 0, page1_btns.size()-1){
connect( page1_btns[id], &QPushButton::clicked, this, [&,id](){
两个id...
@DELI;
__FILE__: `../../Test/a.cpp`, 他虽然是*源文件*的位置 他`.`是你`exe`的位置;
所以 你`QFile`的位置是`.exe`的文件 不是你`pro`文件的(程序都运行了 源代码早没了);
@DELI;
自己对`double`输出 (0.5 + 0.25 + 0.125, 变成5+25+125)
@DELI;
能用`DeleteLater` 就别用delete;
即便是2个窗口 他还是一个进程ID;
@DELI;
打开监听`0端口`: (0端口特殊 不能用);
TCP 0.0.0.0:50619 0.0.0.0:0 LISTENING 3056
TCP [::]:50619 [::]:0 LISTENING 3056
客户端链接`1`端口: (一会就没了)
TCP 127.0.0.1:50624 127.0.0.1:1 SYN_SENT 3056
客户端调用`connectToHost`后, 先进入ConnectingState, 过了一会后 会进入`UnconnectedState `;
@DELI;
建议: 对于静态成员, 不应该用`obj.`的方式 就应该强迫用`T::`;
@DELI;
双指针的算法模板;