<commit_before>Section View
------------

昨天考虑将当前 section 的记录放到 scene 里面管理, 今天准备落实, 才发现依然存在很大的不合理性. scene 的天职, 是对 items 的管理. 而 section 就目前而言, 也只是 items 之一而已. (实际上更适合作为 background) 这样来讲, 作为一个特殊的成员, 对其进行记录, 就显得有点怪异了.

参考了一下 resvip 之后, 发现它是用 section window 这一级来管理当前 section 的. 果然更加恰当一些. 一个 section window 肯定只能同时呈现一个 section, 记录当前的 section 显得无可厚非.

---

想要把数据层面的东西迁移到 section window 这一级别, scene 这一级, 以及更下面的的 item 那一级, 就应该完全不需要 window 对象才是. 但目前的结构, 似乎把 window 作为了一个万能工具包, 从 scene 开始, 一直到每一个 item , 都将 window 当座上宾, 然后事无巨细的请教它.

这种做法, 显然就是前期设计时, 偷懒的结果. 任何东西都没有分层次, 级别. 来一个大一混, 找一个万能药. 实在是要人命.

我现在如果强行将 section 从 projection 类中拆出, 只会拔出萝卜带出泥, 直接涉及到 window 对象这个地头蛇的地位. 只好作罢了.

一步一步来, 每次都跨一小步. 路还很长, 必须耐心.

---

**QString 的奇技淫巧**

大家都知道 `std::string` 的轻巧(弱爆), 对于经常需要字符串处理, 分割, 匹配的童鞋来说, 选取 `QString` 要更为方便.

就分割技术而言, 对于 `std::string` 来说, 想增加这样一个功能, 费老劲了(正则表达式可能是一条捷径). 请见我曾经总结的[字符串分割技术](http://segmentfault.com/a/1190000002483483).

而这对于 QString 来说, 是小儿科, 因为一个 split 方法就搞定了.

QString 中还有许多强大的奇技淫巧, 我略举一二:

1.	拼接请用 arg
2.	找位置请用 indexOf, 这个方法通常用作中间过程
3.	简单的前后截取, 用 right 和 left, 中间截取用 mid.
4.	替换, 用 replace
5.	分割, 用 split

终极杀手锏, 上述方法都可以配合 QRegExp 来使用.

---

譬如我想替换一个字符串中的数字部分.

```cpp
str.replace(QRegExp("\\d+"), QString::number(newNum));
```

一句话就搞定了.<commit_msg>more example of QString<commit_after>Section View
------------

昨天考虑将当前 section 的记录放到 scene 里面管理, 今天准备落实, 才发现依然存在很大的不合理性. scene 的天职, 是对 items 的管理. 而 section 就目前而言, 也只是 items 之一而已. (实际上更适合作为 background) 这样来讲, 作为一个特殊的成员, 对其进行记录, 就显得有点怪异了.

参考了一下 resvip 之后, 发现它是用 section window 这一级来管理当前 section 的. 果然更加恰当一些. 一个 section window 肯定只能同时呈现一个 section, 记录当前的 section 显得无可厚非.

---

想要把数据层面的东西迁移到 section window 这一级别, scene 这一级, 以及更下面的的 item 那一级, 就应该完全不需要 window 对象才是. 但目前的结构, 似乎把 window 作为了一个万能工具包, 从 scene 开始, 一直到每一个 item , 都将 window 当座上宾, 然后事无巨细的请教它.

这种做法, 显然就是前期设计时, 偷懒的结果. 任何东西都没有分层次, 级别. 来一个大一混, 找一个万能药. 实在是要人命.

我现在如果强行将 section 从 projection 类中拆出, 只会拔出萝卜带出泥, 直接涉及到 window 对象这个地头蛇的地位. 只好作罢了.

一步一步来, 每次都跨一小步. 路还很长, 必须耐心.

---

**QString 的奇技淫巧**

大家都知道 `std::string` 的轻巧(弱爆), 对于经常需要字符串处理, 分割, 匹配的童鞋来说, 选取 `QString` 要更为方便.

就分割技术而言, 对于 `std::string` 来说, 想增加这样一个功能, 费老劲了(正则表达式可能是一条捷径). 请见我曾经总结的[字符串分割技术](http://segmentfault.com/a/1190000002483483).

而这对于 QString 来说, 是小儿科, 因为一个 split 方法就搞定了.

QString 中还有许多强大的奇技淫巧, 我略举一二:

1.	拼接请用 arg
2.	找位置请用 indexOf, 这个方法通常用作中间过程
3.	简单的前后截取, 用 right 和 left, 中间截取用 mid.
4.	替换, 用 replace
5.	分割, 用 split

终极杀手锏, 上述方法都可以配合 QRegExp 来使用.

---

譬如我想替换一个字符串中的数字部分.

```cpp
str.replace(QRegExp("\\d+"), QString::number(newNum));
```

再举一个例子, 如果需要在数字前面增加 0, 如 1-9 需要显示成 01 - 09 怎么弄？

```cpp
QString("%1").arg(i, 2, 10, QChar('0')); // i = 1 - 9
```

都是一句话就搞定了.
{'fraction_non_alphanumeric': 0.12428734321550741, 'fraction_numerical': 0.021284682630178638, 'mean_word_length': 4.243027888446215, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3179157', 'n_tokens_mistral': 1978, 'n_tokens_neox': 2130, 'n_words': 321}