├── 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 | --------------------------------------------------------------------------------