#include "dialog_progress_ui.h" #include "ui_dialog_progress_ui.h" #include "lang/app_language.h" #include "huagao/hgscanner_error.h" #include #include #include Dialog_progress_ui *Dialog_progress_ui::m_param = nullptr; Dialog_progress_ui::Dialog_progress_ui(std::function callback, std::function *notify, QWidget *parent) : QDialog(parent), ui(new Ui::Dialog_progress_ui) , m_isScanning(false) { setAttribute(Qt::WA_DeleteOnClose, true); ui->setupUi(this); setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); ui->pbtn_cancelScan->setVisible(false); ui->pbtn_close->setVisible(false); m_callback = callback; *notify = FuncNotify; m_param = this; m_timer = new QTimer(this); connect(this, SIGNAL(scan_status(QString,bool)), this, SLOT(on_scan_status(QString,bool)), Qt::QueuedConnection); connect(this, SIGNAL(scan_finish(int)), this, SLOT(on_scan_finish(int)), Qt::QueuedConnection); } Dialog_progress_ui::~Dialog_progress_ui() { delete ui; } void Dialog_progress_ui::closeEvent(QCloseEvent *e) { if (m_isScanning) { if (e->spontaneous()) { m_callback(UI_RESULT_CLOSE_CANCEL); } e->ignore(); } } void Dialog_progress_ui::on_pbtn_cancelScan_clicked() { m_callback(UI_RESULT_CLOSE_CANCEL); } void notify_close(std::function callback) { std::this_thread::sleep_for(std::chrono::milliseconds(500)); callback(UI_RESULT_CLOSE_NORMAL); } void Dialog_progress_ui::on_pbtn_close_clicked() { disconnect(m_timer, SIGNAL(timeout()), this, SLOT(on_pbtn_close_clicked())); //CloseHandle(CreateThread(NULL, 0, notify_close, (void*)m_callback, 0, 0)); std::thread th_close(notify_close, m_callback); th_close.detach(); // m_callback(UI_RESULT_CLOSE_NORMAL); close(); } void Dialog_progress_ui::on_scan_status(QString finishInfo, bool isScanning) { m_isScanning = isScanning; ui->label->setText(finishInfo); ui->pbtn_cancelScan->setVisible(isScanning); ui->pbtn_close->setVisible(!isScanning); } void Dialog_progress_ui::on_scan_finish(int flag) { if (SCANNER_ERR_OK == flag || SCANNER_ERR_USER_CANCELED == flag) { m_timer->start(2000); connect(m_timer, SIGNAL(timeout()), this, SLOT(on_pbtn_close_clicked()), Qt::QueuedConnection); } } void Dialog_progress_ui::FuncNotify(int event, void *msg, int flag) { Dialog_progress_ui *p = (Dialog_progress_ui *)m_param; if (nullptr == p) { return; } switch (event) { case SANE_EVENT_WORKING: { QString finishInfo((char*)msg); emit p->scan_status(finishInfo, true); } break; case SANE_EVENT_SCAN_FINISHED: { emit p->scan_finish(flag); QString finishInfo((char*)msg); emit p->scan_status(finishInfo, false); } break; } }