Skip to content

Commit 72d1a9d

Browse files
committed
update doc summary
1 parent dbccc36 commit 72d1a9d

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

CONTRIBUTING.md

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@
44
IDE:Qt Creator
55
编译器:Qt 5.12.7 MSVC2017 64bit
66

7-
## 名称规范
8-
前缀约定:
7+
## 前缀约定
8+
99
全局变量:`g_`
1010
常量:`c_`
1111
成员变量:`m_`
1212
静态成员变量:`s_`
1313

14+
## 整体框架
15+
整体架构分为前端(Web)和后端(QT),首先需要完整解析一遍`dblp.xml`文件,耗时约2分钟。解析部分在C++类`Parser`中定义,解析时显示信息的窗口使用`ParseDialog`类定义。解析完成后会生成若干数据文件(以`dat`结尾),其中保存了排序后的索引信息,运行时需要将这些文件加载到内存中。加载部分使用`Loader`类定义,加载完成后会把数据存在`Finder`类的静态变量中。查找时使用二分查找算法(`equalRange`)获取到对应关键字的位置,再从`dblp.xml`文件中读取出‘记录’信息(`Util::findRecord`),其中‘记录’对应的类为`Record`,利用`Record::attr`函数可以访问对应标签的内容,使用`Record::toJson`可以把`Record`转换成一个Json对象(`QJsonObject`)。
16+
17+
解析部分会在单独的线程中运行,具体来说就是先把`dblp.xml`文件一次性读入内存(占用约3G内存)中,接着使用`while`循环遍历一遍所有数据,遇到感兴趣的内容(如`<author``<title``key="`)就保存下该内容及其位置(生成索引)。接着按照字符串排序(调用`std::sort`),把排序好的数组保存在文件中。为了避免大量字符串复制带来的内存开销,使用`Parser::StringRef`内部类来保存字符串,该类的功能相当于`QStringRef`(但是`QStringRef`不支持超过2G的字符串)。
18+
1419
## 本地化
1520
### 预处理
1621
对于C++(QT)代码文件中需要翻译的字符串,使用`QObject::tr`函数包裹起来。例如:`statusBar()->showMessage(tr("Load finished."), 3000);`
@@ -31,12 +36,12 @@ IDE:Qt Creator
3136
后端使用Qt Creator内置的UI设计师进行界面设计。
3237

3338
### 前端
34-
引入前端框架[Bootstrap](https://getbootstrap.com/)的样式文件(`bootstrap.min.css`,版本为4.4.1,注意没有引入JS文件。
39+
引入前端框架[Bootstrap](https://getbootstrap.com/)的样式文件(`bootstrap.min.css`,版本为4.4.1,注意没有引入JS文件。
3540

3641

3742
## 前后端交互
3843
### WebView
39-
临时创建一个Web窗口可以使用`QWebEngineView`,利用`load``setUrl``setHtml`加载数据。若要自定义一些功能(例如拦截URL、自定义右键菜单)可以继承`QWebEngineView``QWebEnginePage`类。具体实现可以参考`WebView``WebPage`
44+
临时创建一个Web窗口可以使用`QWebEngineView`,利用`load``setUrl``setHtml`加载数据。若要自定义一些功能(例如拦截URL、自定义右键菜单)可以继承`QWebEngineView``QWebEnginePage`类。具体实现可以参考`WebView``WebPage`
4045

4146
### WebChannel
4247
若是需要JS和C++通信,可以加入`QWebChannel`。C++端的`WebPage`使用`setWebChannel`指定`WebChannel`,接着使用`registerObject`注册C++类(必须继承QObject),同时在希望被JS端调用的函数前加上宏定义`Q_INVOKABLE`;在HTML文件中引入`qwebchannel.js`文件(在`body`标签末尾加入`<script src="qwebchannel.js"></script>`),在脚本中引入已经注册的C++类、连接QT信号到JS函数。例如:
@@ -48,10 +53,12 @@ new QWebChannel(qt.webChannelTransport, function(channel) {
4853
});
4954
```
5055

51-
其中`ready`是C++类`Finder`的一个信号,`handleSearch`是一个JS定义的函数。
56+
其中`ready`是C++类`Finder`的一个信号,`handleSearch`是一个JS定义的函数。此后可以在其他地方调用`finder`,例如执行`finder.find(type, word)`实质上会调用C++端的`Finder::find`函数。
5257

5358
利用JS调用C++函数(通过函数参数传递信息)以及JS端函数绑定信号(利用信号传递信息到JS函数参数中)可以实现前后端的双向交互。
5459

60+
注意:如果不需要动态传输数据,只需要一次性传输数据(C++传到Web)可以使用字符串替换功能处理HTML文件,具体实现参考`DetailView`的实现。
61+
5562
## 前端测试
5663
为了方便测试前端效果,在JS文件中做了特殊的处理,使得前端文件支持本地打开(利用`location.href`判断)。在浏览器中打开HTML文件会自动加载对应的测试文件`*.test.js`
5764

@@ -60,14 +67,13 @@ new QWebChannel(qt.webChannelTransport, function(channel) {
6067
标题:`The Conjunctive Complexity of Quadratic Boolean Functions.`
6168
禁用标题:`Home Page`
6269

63-
以上数据定义在`index.test.js`文件中。
64-
65-
以下是常见的测试方式:(在浏览器控制台中输入)
66-
67-
`test.author``test.title``test.homepage`等命令,测试对应结果的样式。
68-
`language='en'``language='zh'`测试翻译是否正确。
70+
完整的测试数据和测试命令可查看`index.test.js`文件。
6971

70-
可以在JS文件中加入上述命令来自动执行。
72+
以下是常见的测试方式:
73+
* 直接输入测试数据。
74+
* 在浏览器控制台中输入 `test.author``test.title``test.homepage`等命令,测试对应结果的样式。
75+
* 在浏览器控制台中输入`language='en'``language='zh'`测试翻译是否正确。
76+
* 在JS文件中加入上述命令来自动执行。
7177

7278
## 发布
7379

0 commit comments

Comments
 (0)