├── img.qrc
├── images
├── no.gif
├── yes.gif
├── unsure.png
└── unknown.png
├── README.md
├── main.cpp
├── image.qrc
├── anno_pro.pro
├── mainwindow.h
├── mainwindow.ui
├── mainwindow.cpp
└── anno_pro.pro.user
/img.qrc:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/images/no.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miaoerduo/Anno_pro/HEAD/images/no.gif
--------------------------------------------------------------------------------
/images/yes.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miaoerduo/Anno_pro/HEAD/images/yes.gif
--------------------------------------------------------------------------------
/images/unsure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miaoerduo/Anno_pro/HEAD/images/unsure.png
--------------------------------------------------------------------------------
/images/unknown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miaoerduo/Anno_pro/HEAD/images/unknown.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Anno_pro
2 | 一个人脸认证标注的小工具。
3 |
4 | 博客地址:
5 | http://www.miaoerduo.com/qt/一个简单粗暴的人脸认证标注工具的实现.html
6 |
7 | 欢迎指正~
8 |
--------------------------------------------------------------------------------
/main.cpp:
--------------------------------------------------------------------------------
1 | #include "mainwindow.h"
2 | #include
3 |
4 | int main(int argc, char *argv[])
5 | {
6 | QApplication a(argc, argv);
7 | MainWindow w;
8 | w.show();
9 |
10 | return a.exec();
11 | }
12 |
--------------------------------------------------------------------------------
/image.qrc:
--------------------------------------------------------------------------------
1 |
2 |
3 | images/no.gif
4 | images/unknown.png
5 | images/yes.gif
6 | images/unsure.png
7 |
8 |
9 |
--------------------------------------------------------------------------------
/anno_pro.pro:
--------------------------------------------------------------------------------
1 | #-------------------------------------------------
2 | #
3 | # Project created by QtCreator 2016-12-28T14:58:56
4 | #
5 | #-------------------------------------------------
6 |
7 | QT += core gui
8 |
9 | greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
10 |
11 | TARGET = anno_pro
12 | TEMPLATE = app
13 |
14 |
15 | SOURCES += main.cpp\
16 | mainwindow.cpp
17 |
18 | HEADERS += mainwindow.h
19 |
20 | FORMS += mainwindow.ui
21 |
22 | RESOURCES += \
23 | image.qrc
24 |
--------------------------------------------------------------------------------
/mainwindow.h:
--------------------------------------------------------------------------------
1 | #ifndef MAINWINDOW_H
2 | #define MAINWINDOW_H
3 |
4 | #include
5 | #include
6 | #include
7 | #include
8 | #include
9 |
10 | namespace Ui {
11 | class MainWindow;
12 | }
13 |
14 | enum AnnoState {
15 | UNKNOWN = 0, // 未标注
16 | YES = 1, // 匹配
17 | NO = 2, // 不匹配
18 | UNSURE = 3 // 不确定
19 | };
20 |
21 | class MainWindow : public QMainWindow
22 | {
23 | Q_OBJECT
24 |
25 | public:
26 | explicit MainWindow(QWidget *parent = 0);
27 | ~MainWindow();
28 |
29 | protected:
30 | void closeEvent(QCloseEvent *event); // 窗口关闭事件
31 | void keyReleaseEvent(QKeyEvent *event); // 键盘事件
32 |
33 | private slots:
34 | void on_pushButton_save_clicked();
35 |
36 | void on_pushButton_ok_clicked();
37 |
38 | void on_pushButton_no_clicked();
39 |
40 | void on_pushButton_unsure_clicked();
41 |
42 | void on_pushButton_next_clicked();
43 |
44 | void on_pushButton_prev_clicked();
45 |
46 | void on_pushButton_switch_clicked();
47 |
48 | void on_horizontalSlider_progress_sliderReleased();
49 |
50 | private:
51 | void display();
52 |
53 | private:
54 | Ui::MainWindow *ui; // 自带的,ui界面的接口
55 | std::vector image_list_1; // 用来存放左边的图片的list
56 | std::vector image_list_2; // 用来存放右边的图片的list
57 | int current_idx; // 当前图片对的id
58 | int total_pair_num; // 总共的图片对的数目
59 | std::vector< AnnoState > annotation_list; // 标注的结果
60 | bool updated; // 表示结果保存之后有没有更新
61 | };
62 |
63 | #endif // MAINWINDOW_H
64 |
--------------------------------------------------------------------------------
/mainwindow.ui:
--------------------------------------------------------------------------------
1 |
2 |
3 | MainWindow
4 |
5 |
6 |
7 | 0
8 | 0
9 | 800
10 | 600
11 |
12 |
13 |
14 | Anno Pro
15 |
16 |
17 | color: black;
18 | font-weight: bold;
19 |
20 |
21 |
22 |
23 |
24 | 50
25 | 130
26 | 700
27 | 370
28 |
29 |
30 |
31 | QFrame::StyledPanel
32 |
33 |
34 | QFrame::Raised
35 |
36 |
37 |
38 |
39 | 30
40 | 30
41 | 300
42 | 300
43 |
44 |
45 |
46 | TextLabel
47 |
48 |
49 | Qt::AlignCenter
50 |
51 |
52 |
53 |
54 |
55 | 370
56 | 30
57 | 300
58 | 300
59 |
60 |
61 |
62 | TextLabel
63 |
64 |
65 | Qt::AlignCenter
66 |
67 |
68 |
69 |
70 |
71 | 30
72 | 4
73 | 300
74 | 16
75 |
76 |
77 |
78 | left
79 |
80 |
81 | Qt::AlignCenter
82 |
83 |
84 |
85 |
86 |
87 | 370
88 | 4
89 | 300
90 | 16
91 |
92 |
93 |
94 | right
95 |
96 |
97 | Qt::AlignCenter
98 |
99 |
100 |
101 |
102 |
103 | 30
104 | 340
105 | 300
106 | 16
107 |
108 |
109 |
110 | TextLabel
111 |
112 |
113 | Qt::AlignCenter
114 |
115 |
116 |
117 |
118 |
119 | 370
120 | 340
121 | 300
122 | 16
123 |
124 |
125 |
126 | TextLabel
127 |
128 |
129 | Qt::AlignCenter
130 |
131 |
132 |
133 |
134 |
135 |
136 | 50
137 | 30
138 | 80
139 | 30
140 |
141 |
142 |
143 |
144 |
145 |
146 | SAVE
147 |
148 |
149 |
150 |
151 |
152 | 390
153 | 30
154 | 361
155 | 21
156 |
157 |
158 |
159 | Qt::Horizontal
160 |
161 |
162 |
163 |
164 |
165 | 365
166 | 55
167 | 70
168 | 70
169 |
170 |
171 |
172 | TextLabel
173 |
174 |
175 |
176 |
177 |
178 | 299
179 | 30
180 | 81
181 | 20
182 |
183 |
184 |
185 | PROGRESS
186 |
187 |
188 |
189 |
190 |
191 | 50
192 | 510
193 | 700
194 | 61
195 |
196 |
197 |
198 | QFrame::StyledPanel
199 |
200 |
201 | QFrame::Raised
202 |
203 |
204 |
205 | true
206 |
207 |
208 |
209 | 151
210 | 18
211 | 84
212 | 30
213 |
214 |
215 |
216 | PREV
217 |
218 |
219 |
220 |
221 |
222 | 241
223 | 18
224 | 84
225 | 30
226 |
227 |
228 |
229 | NEXT
230 |
231 |
232 |
233 |
234 |
235 | 331
236 | 18
237 | 84
238 | 30
239 |
240 |
241 |
242 | UNSURE
243 |
244 |
245 |
246 |
247 |
248 | 421
249 | 18
250 | 84
251 | 30
252 |
253 |
254 |
255 | SWITCH
256 |
257 |
258 |
259 |
260 |
261 | 511
262 | 18
263 | 84
264 | 30
265 |
266 |
267 |
268 | NO
269 |
270 |
271 |
272 |
273 |
274 | 601
275 | 18
276 | 84
277 | 30
278 |
279 |
280 |
281 | YES
282 |
283 |
284 |
285 |
286 |
287 |
288 | 285
289 | 85
290 | 30
291 | 30
292 |
293 |
294 |
295 | TextLabel
296 |
297 |
298 |
299 |
300 |
301 | 475
302 | 85
303 | 30
304 | 30
305 |
306 |
307 |
308 | TextLabel
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
--------------------------------------------------------------------------------
/mainwindow.cpp:
--------------------------------------------------------------------------------
1 | #include "mainwindow.h"
2 | #include "ui_mainwindow.h"
3 | #include "QFileDialog"
4 | #include "QMessageBox"
5 | #include
6 | #include
7 | #include
8 | #include
9 |
10 | const std::string UNSURE_FILE = ":File/images/unsure.png";
11 | const std::string YES_FILE = ":File/images/yes.gif";
12 | const std::string NO_FILE = ":File/images/no.gif";
13 | const std::string UNKNOWN_FILE = ":File/images/unknown.png";
14 |
15 | std::string get_label_image(AnnoState state) {
16 | std::string show_image_name = UNKNOWN_FILE;
17 | switch (state) {
18 | case AnnoState::UNKNOWN:
19 | show_image_name = UNKNOWN_FILE;
20 | break;
21 | case AnnoState::YES:
22 | show_image_name = YES_FILE;
23 | break;
24 | case AnnoState::NO:
25 | show_image_name = NO_FILE;
26 | break;
27 | case AnnoState::UNSURE:
28 | show_image_name = UNSURE_FILE;
29 | break;
30 | }
31 | return show_image_name;
32 | }
33 |
34 | /**
35 | * @brief set_image 将图像设置到label上,图像自动根据label的大小来缩放
36 | * @param label
37 | * @param image
38 | */
39 | void set_image(QLabel *label, const QPixmap &image) {
40 | if (image.width() <= label->width() && image.height() <= label->height()) {
41 | label->setPixmap(image);
42 | return;
43 | }
44 | float ratio(0.);
45 | ratio = 1. * label->width() / image.width();
46 | ratio = fmin( 1. * label->height() / image.height(), ratio );
47 | QPixmap m = image.scaled(static_cast(image.width() * ratio), static_cast(image.height() * ratio));
48 | label->setPixmap(m);
49 | }
50 |
51 | void set_image(QLabel *label, const std::string image_path) {
52 | QPixmap image(image_path.c_str());
53 | set_image(label, image);
54 | }
55 |
56 |
57 | MainWindow::MainWindow(QWidget *parent) :
58 | QMainWindow(parent),
59 | ui(new Ui::MainWindow),
60 | updated(false)
61 | {
62 | ui->setupUi(this);
63 | std::string type = "0";
64 |
65 | // 选择输入文件
66 | while (1) {
67 | QString file_name = QFileDialog::getOpenFileName(this, "choose a file to annotate", ".");
68 | if (file_name.isEmpty()) {
69 | int ok = QMessageBox::information(this, "choose a file to annotate", "Don't want to work now?", QMessageBox::Ok | QMessageBox::Cancel);
70 | if (ok == QMessageBox::Ok) {
71 | exit(0);
72 | }
73 | continue;
74 | }
75 | std::ifstream is(file_name.toStdString());
76 | is >> type;
77 | if ("0" == type) {
78 | std::string image_name;
79 | bool is_odd = true;
80 | while (is >> image_name) {
81 | if (is_odd) {
82 | this->image_list_1.push_back(image_name);
83 | } else {
84 | this->image_list_2.push_back(image_name);
85 | }
86 | is_odd = !is_odd;
87 | }
88 | is.close();
89 | } else if ("1" == type) {
90 | std::string image_name1, image_name2;
91 | int _label;
92 | while (is >> image_name1 >> image_name2 >> _label) {
93 | this->image_list_1.push_back(image_name1);
94 | this->image_list_2.push_back(image_name2);
95 | this->annotation_list.push_back(AnnoState(_label));
96 | }
97 | is.close();
98 | }
99 | if (image_list_1.size() != image_list_2.size()) {
100 | QMessageBox::information(this, "choose a file to annotate", "this image list is not even", QMessageBox::Ok);
101 | continue;
102 | }
103 | if (0 == image_list_1.size()) {
104 | QMessageBox::information(this, "choose a file to annotate", "this image list is empty", QMessageBox::Ok);
105 | continue;
106 | }
107 | break;
108 | }
109 |
110 | assert(image_list_1.size() == image_list_2.size());
111 | // 初始化其他参数
112 | this->total_pair_num = image_list_1.size();
113 | if ("0" == type) {
114 | this->current_idx = 0;
115 | std::vector annotation_list(this->total_pair_num, AnnoState::UNKNOWN);
116 | this->annotation_list.swap(annotation_list);
117 | } else {
118 | for (int idx = this->annotation_list.size() - 1; idx >= 0; -- idx) {
119 | if (this->annotation_list[idx] != AnnoState::UNKNOWN) {
120 | this->current_idx = idx;
121 | std::cout << "this->current_idx: " << this->current_idx << std::endl;
122 | break;
123 | }
124 | }
125 | }
126 |
127 | display();
128 | }
129 |
130 | MainWindow::~MainWindow()
131 | {
132 | delete ui;
133 | }
134 |
135 | /**
136 | * @brief MainWindow::display \n
137 | * 根据系统中的所有的变量来设置当前界面中的各个部分的内容
138 | */
139 | void MainWindow::display() {
140 |
141 | if (this->current_idx >= this->total_pair_num) {
142 | QMessageBox::information(this, "annotation over", "Congratulations! You've finished all the job! Please save your work :)", QMessageBox::Ok);
143 | this->current_idx = this->total_pair_num - 1;
144 | }
145 | if (this->current_idx < 0) {
146 | QMessageBox::information(this, "annotation warning", "You must start at 0 (not a negative position, I konw you wanna challenge this app) :)", QMessageBox::Ok);
147 | this->current_idx = 0;
148 | }
149 |
150 | // 进度条
151 | this->ui->horizontalSlider_progress->setRange(0, this->total_pair_num - 1);
152 | this->ui->horizontalSlider_progress->setValue(this->current_idx);
153 |
154 | // 状态栏
155 | this->ui->statusBar->showMessage(QString((std::to_string(this->current_idx + 1) + " / " + std::to_string(this->total_pair_num)).c_str()));
156 |
157 | // 文件名
158 | std::string image_name_1 = this->image_list_1[this->current_idx];
159 | std::string image_base_name_1 = image_name_1.substr(image_name_1.find_last_of("/") + 1);
160 | std::string image_name_2 = this->image_list_2[this->current_idx];
161 | std::string image_base_name_2 = image_name_2.substr(image_name_2.find_last_of("/") + 1);
162 | this->ui->label_image_name_1->setText(image_base_name_1.c_str());
163 | this->ui->label_image_name_2->setText(image_base_name_2.c_str());
164 |
165 | // 显示图像
166 | set_image(this->ui->label_image_view_1, image_name_1);
167 | set_image(this->ui->label_image_view_2, image_name_2);
168 |
169 | // 显示标注结果
170 | std::string show_image_name = get_label_image(this->annotation_list[this->current_idx]);
171 | set_image(this->ui->label_image_compare_status, show_image_name);
172 | std::string prev_image_name = UNKNOWN_FILE;
173 | if ((this->current_idx - 1) >= 0) {
174 | prev_image_name = get_label_image(this->annotation_list[this->current_idx - 1]);
175 | }
176 | set_image(this->ui->label_prev_image_compare_status, prev_image_name);
177 |
178 | std::string next_image_name = UNKNOWN_FILE;
179 | if ((this->current_idx + 1) < static_cast(this->annotation_list.size())) {
180 | next_image_name = get_label_image(this->annotation_list[this->current_idx + 1]);
181 | }
182 | set_image(this->ui->label_next_image_compare_status, next_image_name);
183 |
184 | }
185 |
186 | /**
187 | * @brief MainWindow::on_pushButton_save_clicked \n
188 | * 保存结果文件
189 | */
190 | void MainWindow::on_pushButton_save_clicked()
191 | {
192 | QString file_name = QFileDialog::getSaveFileName(this, "choose a file to save", ".");
193 | if (file_name.isEmpty()) {
194 | QMessageBox::information(this, "choose a file to save", "please enter a legal file name", QMessageBox::Ok);
195 | return;
196 | }
197 | std::ofstream os(file_name.toStdString());
198 | os << "1\n";
199 | for (int idx = 0; idx < static_cast(this->annotation_list.size()); ++ idx) {
200 | os << this->image_list_1[idx] << " " << this->image_list_2[idx] << " " << this->annotation_list[idx] << "\n";
201 | }
202 | os.close();
203 | QMessageBox::information(this, "save", "save result success", QMessageBox::Ok);
204 | updated = false;
205 | }
206 |
207 | /**
208 | * @brief MainWindow::on_pushButton_ok_clicked
209 | * 标注为"匹配"
210 | */
211 | void MainWindow::on_pushButton_ok_clicked()
212 | {
213 | this->annotation_list[this->current_idx] = AnnoState::YES;
214 | ++ this->current_idx;
215 | updated = true;
216 | display();
217 | }
218 |
219 | /**
220 | * @brief MainWindow::on_pushButton_no_clicked
221 | * 标注为"不匹配"
222 | */
223 | void MainWindow::on_pushButton_no_clicked()
224 | {
225 | this->annotation_list[this->current_idx] = AnnoState::NO;
226 | ++ this->current_idx;
227 | updated = true;
228 | display();
229 | }
230 |
231 | /**
232 | * @brief MainWindow::on_pushButton_unsure_clicked
233 | * 标注为"不确定"
234 | */
235 | void MainWindow::on_pushButton_unsure_clicked()
236 | {
237 | this->annotation_list[this->current_idx] = AnnoState::UNSURE;
238 | ++ this->current_idx;
239 | updated = true;
240 | display();
241 | }
242 |
243 | /**
244 | * @brief MainWindow::on_pushButton_next_clicked
245 | * 移动到下一组
246 | */
247 | void MainWindow::on_pushButton_next_clicked()
248 | {
249 | ++ this->current_idx;
250 | display();
251 | }
252 |
253 | /**
254 | * @brief MainWindow::on_pushButton_prev_clicked
255 | * 移动到上一组
256 | */
257 | void MainWindow::on_pushButton_prev_clicked()
258 | {
259 | -- this->current_idx;
260 | display();
261 | }
262 |
263 | /**
264 | * @brief MainWindow::on_pushButton_switch_clicked
265 | * 交换两边的图片
266 | */
267 | void MainWindow::on_pushButton_switch_clicked()
268 | {
269 | std::string tmp = this->image_list_1[this->current_idx];
270 | this->image_list_1[this->current_idx] = this->image_list_2[this->current_idx];
271 | this->image_list_2[this->current_idx] = tmp;
272 | updated = true;
273 | display();
274 | }
275 |
276 | /**
277 | * @brief MainWindow::on_horizontalSlider_progress_sliderReleased
278 | * 拖放进度条,控制进度
279 | */
280 | void MainWindow::on_horizontalSlider_progress_sliderReleased()
281 | {
282 | int pos = this->ui->horizontalSlider_progress->value();
283 | this->current_idx = pos;
284 | this->display();
285 | }
286 |
287 | void MainWindow::closeEvent(QCloseEvent *event) {
288 | if (updated) this->on_pushButton_save_clicked();
289 | QWidget::closeEvent(event);
290 | }
291 |
292 | void MainWindow::keyReleaseEvent(QKeyEvent *event) {
293 |
294 | /*
295 | * a : prev
296 | * d : next
297 | * w : yes
298 | * s : no
299 | * space: unsure
300 | * c: switch
301 | *
302 | * j : prev
303 | * l : next
304 | * k : no
305 | * i : yes
306 | * m : swicth
307 | *
308 | * left: prev
309 | * right: next
310 | * up: yes
311 | * down: no
312 | */
313 | switch (event->key()) {
314 | case Qt::Key_A:
315 | case Qt::Key_J:
316 | case Qt::Key_Left:
317 | this->on_pushButton_prev_clicked();
318 | break;
319 | case Qt::Key_D:
320 | case Qt::Key_L:
321 | case Qt::Key_Right:
322 | this->on_pushButton_next_clicked();
323 | break;
324 | case Qt::Key_W:
325 | case Qt::Key_I:
326 | case Qt::Key_Up:
327 | this->on_pushButton_ok_clicked();
328 | break;
329 | case Qt::Key_S:
330 | case Qt::Key_K:
331 | case Qt::Key_Down:
332 | this->on_pushButton_no_clicked();
333 | break;
334 | case Qt::Key_C:
335 | case Qt::Key_M:
336 | this->on_pushButton_switch_clicked();
337 | break;
338 | case Qt::Key_Space:
339 | this->on_pushButton_unsure_clicked();
340 | break;
341 | }
342 | }
343 |
--------------------------------------------------------------------------------
/anno_pro.pro.user:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | EnvironmentId
7 | {dce21770-306f-43b8-ba58-beda98cc1a12}
8 |
9 |
10 | ProjectExplorer.Project.ActiveTarget
11 | 0
12 |
13 |
14 | ProjectExplorer.Project.EditorSettings
15 |
16 | true
17 | false
18 | true
19 |
20 | Cpp
21 |
22 | CppGlobal
23 |
24 |
25 |
26 | QmlJS
27 |
28 | QmlJSGlobal
29 |
30 |
31 | 2
32 | UTF-8
33 | false
34 | 4
35 | false
36 | 80
37 | true
38 | true
39 | 1
40 | true
41 | false
42 | 0
43 | true
44 | true
45 | 0
46 | 8
47 | true
48 | 1
49 | true
50 | true
51 | true
52 | false
53 |
54 |
55 |
56 | ProjectExplorer.Project.PluginSettings
57 |
58 |
59 |
60 |
61 |
62 | ProjectExplorer.Project.Target.0
63 |
64 | Desktop Qt 5.7.0 clang 64bit
65 | Desktop Qt 5.7.0 clang 64bit
66 | qt.57.clang_64_kit
67 | 1
68 | 0
69 | 0
70 |
71 | /Users/zhaoyu/workspace/QT/build-anno_pro-Desktop_Qt_5_7_0_clang_64bit-Debug
72 |
73 |
74 | true
75 | qmake
76 |
77 | QtProjectManager.QMakeBuildStep
78 | true
79 |
80 | false
81 | false
82 | false
83 |
84 |
85 | true
86 | Make
87 |
88 | Qt4ProjectManager.MakeStep
89 |
90 | -w
91 | -r
92 |
93 | false
94 |
95 |
96 |
97 | 2
98 | 构建
99 |
100 | ProjectExplorer.BuildSteps.Build
101 |
102 |
103 |
104 | true
105 | Make
106 |
107 | Qt4ProjectManager.MakeStep
108 |
109 | -w
110 | -r
111 |
112 | true
113 | clean
114 |
115 |
116 | 1
117 | 清理
118 |
119 | ProjectExplorer.BuildSteps.Clean
120 |
121 | 2
122 | false
123 |
124 | Debug
125 |
126 | Qt4ProjectManager.Qt4BuildConfiguration
127 | 2
128 | true
129 |
130 |
131 | /Users/zhaoyu/workspace/QT/build-anno_pro-Desktop_Qt_5_7_0_clang_64bit-Release
132 |
133 |
134 | true
135 | qmake
136 |
137 | QtProjectManager.QMakeBuildStep
138 | false
139 |
140 | false
141 | false
142 | false
143 |
144 |
145 | true
146 | Make
147 |
148 | Qt4ProjectManager.MakeStep
149 |
150 | -w
151 | -r
152 |
153 | false
154 |
155 |
156 |
157 | 2
158 | 构建
159 |
160 | ProjectExplorer.BuildSteps.Build
161 |
162 |
163 |
164 | true
165 | Make
166 |
167 | Qt4ProjectManager.MakeStep
168 |
169 | -w
170 | -r
171 |
172 | true
173 | clean
174 |
175 |
176 | 1
177 | 清理
178 |
179 | ProjectExplorer.BuildSteps.Clean
180 |
181 | 2
182 | false
183 |
184 | Release
185 |
186 | Qt4ProjectManager.Qt4BuildConfiguration
187 | 0
188 | true
189 |
190 |
191 | /Users/zhaoyu/workspace/QT/build-anno_pro-Desktop_Qt_5_7_0_clang_64bit-Profile
192 |
193 |
194 | true
195 | qmake
196 |
197 | QtProjectManager.QMakeBuildStep
198 | true
199 |
200 | false
201 | true
202 | false
203 |
204 |
205 | true
206 | Make
207 |
208 | Qt4ProjectManager.MakeStep
209 |
210 | -w
211 | -r
212 |
213 | false
214 |
215 |
216 |
217 | 2
218 | 构建
219 |
220 | ProjectExplorer.BuildSteps.Build
221 |
222 |
223 |
224 | true
225 | Make
226 |
227 | Qt4ProjectManager.MakeStep
228 |
229 | -w
230 | -r
231 |
232 | true
233 | clean
234 |
235 |
236 | 1
237 | 清理
238 |
239 | ProjectExplorer.BuildSteps.Clean
240 |
241 | 2
242 | false
243 |
244 | Profile
245 |
246 | Qt4ProjectManager.Qt4BuildConfiguration
247 | 0
248 | true
249 |
250 | 3
251 |
252 |
253 | 0
254 | 部署
255 |
256 | ProjectExplorer.BuildSteps.Deploy
257 |
258 | 1
259 | 在本地部署
260 |
261 | ProjectExplorer.DefaultDeployConfiguration
262 |
263 | 1
264 |
265 |
266 | false
267 | false
268 | 1000
269 |
270 | true
271 |
272 | false
273 | false
274 | false
275 | false
276 | true
277 | 0.01
278 | 10
279 | true
280 | 1
281 | 25
282 |
283 | 1
284 | true
285 | false
286 | true
287 | valgrind
288 |
289 | 0
290 | 1
291 | 2
292 | 3
293 | 4
294 | 5
295 | 6
296 | 7
297 | 8
298 | 9
299 | 10
300 | 11
301 | 12
302 | 13
303 | 14
304 |
305 | 2
306 |
307 | anno_pro
308 |
309 | Qt4ProjectManager.Qt4RunConfiguration:/Users/zhaoyu/workspace/QT/anno_pro/anno_pro.pro
310 | true
311 |
312 | anno_pro.pro
313 | false
314 |
315 | /Users/zhaoyu/workspace/QT/build-anno_pro-Desktop_Qt_5_7_0_clang_64bit-Release/anno_pro.app/Contents/MacOS
316 | 3768
317 | false
318 | true
319 | false
320 | false
321 | true
322 |
323 | 1
324 |
325 |
326 |
327 | ProjectExplorer.Project.TargetCount
328 | 1
329 |
330 |
331 | ProjectExplorer.Project.Updater.FileVersion
332 | 18
333 |
334 |
335 | Version
336 | 18
337 |
338 |
339 |
--------------------------------------------------------------------------------