#include "mainwindow.h" #include "ui_mainwindow.h" #include "dialog_scan.h" #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); m_scanDlg = new Dialog_Scan(this); m_trayIcon = new QSystemTrayIcon(this); m_trayIcon->setIcon(QIcon(":images/image_rsc/png/logo.png")); m_trayIcon->show(); m_trayIcon->setToolTip(tr("HuaGao Scan Tool")); qRegisterMetaType("QSystemTrayIcon::ActivationReason"); connect(m_trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::on_trayActivated); m_scanAction = new QAction(tr("Scan Setting"), this); connect(m_scanAction, &QAction::triggered, this, &MainWindow::on_showScanSettingDlg); m_btnAction = new QAction(tr("Button Setting"), this); connect(m_btnAction, &QAction::triggered, this, &MainWindow::on_showMainWindowDlg); m_quitAction = new QAction(tr("Exit"), this); connect(m_quitAction, &QAction::triggered, this, &QCoreApplication::quit); //应用程序的退出 //创建菜单,添加菜单项 m_trayIconMenu = new QMenu(this); m_trayIconMenu->addAction(m_scanAction); m_trayIconMenu->addAction(m_btnAction); m_trayIconMenu->addSeparator(); //分割线 m_trayIconMenu->addAction(m_quitAction); //给系统托盘添加右键菜单 m_trayIcon->setContextMenu(m_trayIconMenu); ui->tableWidget->setColumnCount(4); ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableWidget->setStyleSheet("selection-background-color:rgb(0, 120, 215)"); ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); ui->tableWidget->horizontalHeader()->setFixedHeight(40); ui->tableWidget->horizontalHeader()->setStretchLastSection(true); ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("Device Type")); ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("Button Type")); ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("Device Config")); ui->tableWidget->setHorizontalHeaderItem(3, new QTableWidgetItem("Save Param")); ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); ui->tableWidget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch); ui->tableWidget->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Stretch); // TODO 读取配置文件,设置m_vScanParams ui->tableWidget->setRowCount((int)m_vScanParams.size()); for (int index = 0; index < (int)m_vScanParams.size(); ++index) { ui->tableWidget->setRowHeight(index, 30); ui->tableWidget->setItem(index, 0, new QTableWidgetItem(QString(m_vScanParams[index].deviceType.c_str()))); ui->tableWidget->item(index, 0)->setTextAlignment(Qt::AlignCenter); ui->tableWidget->item(index, 0)->setFlags(ui->tableWidget->item(index, 0)->flags() & ~Qt::ItemIsEditable); const char *btnTypeStr[] = {"Manual", "Button 1", "Button 2", "Button 3"}; ui->tableWidget->setItem(index, 1, new QTableWidgetItem(btnTypeStr[m_vScanParams[index].buttonId])); ui->tableWidget->item(index, 1)->setTextAlignment(Qt::AlignCenter); ui->tableWidget->item(index, 1)->setFlags(ui->tableWidget->item(index, 1)->flags() & ~Qt::ItemIsEditable); ui->tableWidget->setItem(index, 2, new QTableWidgetItem(GetDesc(m_vScanParams[index].deviceConfigs))); ui->tableWidget->item(index, 2)->setTextAlignment(Qt::AlignCenter); ui->tableWidget->item(index, 2)->setFlags(ui->tableWidget->item(index, 2)->flags() & ~Qt::ItemIsEditable); ui->tableWidget->setItem(index, 3, new QTableWidgetItem(GetDesc(m_vScanParams[index].saveParam))); ui->tableWidget->item(index, 3)->setTextAlignment(Qt::AlignCenter); ui->tableWidget->item(index, 3)->setFlags(ui->tableWidget->item(index, 3)->flags() & ~Qt::ItemIsEditable); } ui->tableWidget->selectRow(0); } MainWindow::~MainWindow() { delete m_scanDlg; delete ui; } bool MainWindow::GetScanParam(const std::string &deviceType, unsigned int buttonId, ScanParam &scanParam) { for (int i = 0; i < (int)m_vScanParams.size(); ++i) { if (deviceType == m_vScanParams[i].deviceType && buttonId == m_vScanParams[i].buttonId) { scanParam = m_vScanParams[i]; return true; } } return false; } bool MainWindow::FindScanParam(const std::string &deviceType, unsigned int buttonId, int ignoreIndex) { for (int i = 0; i < (int)m_vScanParams.size(); ++i) { if (deviceType == m_vScanParams[i].deviceType && buttonId == m_vScanParams[i].buttonId) { if (-1 == ignoreIndex) // 表示均不忽略 { return true; } else if (i != ignoreIndex) { return true; } } } return false; } QString MainWindow::GetDesc(const std::vector &deviceConfigs) { QString desc; return desc; } QString MainWindow::GetDesc(const SaveParam &saveParam) { QString desc; desc += "["; desc += tr("Save path:"); desc += saveParam.m_savePath; desc += "]"; desc += " "; desc += "["; desc += tr("Image format:"); desc += saveParam.m_fileNameExt; desc += "]"; return desc; } void MainWindow::closeEvent(QCloseEvent *e) { if (m_trayIcon->isVisible()) //托盘是显示的 { hide(); // 隐藏主窗口 e->ignore(); //忽略关闭事件,这样才不会关闭程序 } } void MainWindow::on_trayActivated(QSystemTrayIcon::ActivationReason reason) { if (QSystemTrayIcon::Trigger == reason) { } else if (QSystemTrayIcon::DoubleClick == reason) { show(); raise(); } else if (QSystemTrayIcon::MiddleClick == reason) { } } void MainWindow::on_showScanSettingDlg() { m_scanDlg->show(); m_scanDlg->raise(); } void MainWindow::on_showMainWindowDlg() { show(); raise(); } void MainWindow::on_pushButtonAdd_clicked() { if (NULL == m_scanDlg->m_devHandle) { QMessageBox::information(this, tr("Tips"), tr("Device is offline")); return; } std::string deviceType = m_scanDlg->m_devName.toStdString(); char v[256] = {0}; SANE_Status status = sane_control_option(m_scanDlg->m_devHandle, (SANE_Int)0x886D, SANE_ACTION_GET_VALUE, v, NULL); if (SANE_STATUS_GOOD == status) { deviceType = v; } Dialog_Add dlg(m_scanDlg->m_devHandle, this, deviceType); if (dlg.exec()) { ScanParam scanParam = dlg.GetScanParam(); m_vScanParams.push_back(scanParam); // TODO 保存m_vScanParams ui->tableWidget->setRowCount((int)m_vScanParams.size()); int index = (int)m_vScanParams.size() - 1; ui->tableWidget->setRowHeight(index, 30); ui->tableWidget->setItem(index, 0, new QTableWidgetItem(QString(m_vScanParams[index].deviceType.c_str()))); ui->tableWidget->item(index, 0)->setTextAlignment(Qt::AlignCenter); ui->tableWidget->item(index, 0)->setFlags(ui->tableWidget->item(index, 0)->flags() & ~Qt::ItemIsEditable); const char *btnTypeStr[] = {"Manual", "Button 1", "Button 2", "Button 3"}; ui->tableWidget->setItem(index, 1, new QTableWidgetItem(btnTypeStr[m_vScanParams[index].buttonId])); ui->tableWidget->item(index, 1)->setTextAlignment(Qt::AlignCenter); ui->tableWidget->item(index, 1)->setFlags(ui->tableWidget->item(index, 1)->flags() & ~Qt::ItemIsEditable); ui->tableWidget->setItem(index, 2, new QTableWidgetItem(GetDesc(m_vScanParams[index].deviceConfigs))); ui->tableWidget->item(index, 2)->setTextAlignment(Qt::AlignCenter); ui->tableWidget->item(index, 2)->setFlags(ui->tableWidget->item(index, 2)->flags() & ~Qt::ItemIsEditable); ui->tableWidget->setItem(index, 3, new QTableWidgetItem(GetDesc(m_vScanParams[index].saveParam))); ui->tableWidget->item(index, 3)->setTextAlignment(Qt::AlignCenter); ui->tableWidget->item(index, 3)->setFlags(ui->tableWidget->item(index, 3)->flags() & ~Qt::ItemIsEditable); ui->tableWidget->selectRow(index); } } void MainWindow::on_pushButtonModify_clicked() { int index = ui->tableWidget->currentRow(); if (-1 == index) { QMessageBox::information(this, tr("Tips"), tr("No item selected")); return; } if (NULL == m_scanDlg->m_devHandle) { QMessageBox::information(this, tr("Tips"), tr("Device is offline")); return; } std::string deviceType = m_scanDlg->m_devName.toStdString(); char v[256] = {0}; SANE_Status status = sane_control_option(m_scanDlg->m_devHandle, (SANE_Int)0x886D, SANE_ACTION_GET_VALUE, v, NULL); if (SANE_STATUS_GOOD == status) { deviceType = v; } if (deviceType != m_vScanParams[index].deviceType) { QMessageBox::information(this, tr("Tips"), tr("Device type mismatch")); return; } Dialog_Add dlg(m_scanDlg->m_devHandle, this, m_vScanParams[index], index); if (dlg.exec()) { ScanParam scanParam = dlg.GetScanParam(); m_vScanParams[index] = scanParam; // TODO 保存m_vScanParams ui->tableWidget->item(index, 0)->setText(QString::fromStdString(m_vScanParams[index].deviceType)); const char *btnTypeStr[] = {"Manual", "Button 1", "Button 2", "Button 3"}; ui->tableWidget->item(index, 1)->setText(QString::fromStdString(btnTypeStr[m_vScanParams[index].buttonId])); ui->tableWidget->item(index, 2)->setText(GetDesc(m_vScanParams[index].deviceConfigs)); ui->tableWidget->item(index, 3)->setText(GetDesc(m_vScanParams[index].saveParam)); } } void MainWindow::on_pushButtonRemove_clicked() { int index = ui->tableWidget->currentRow(); if (-1 == index) { QMessageBox::information(this, tr("Tips"), tr("No item selected")); return; } QMessageBox msg(QMessageBox::Question, tr("Question"), tr("Are you sure you want to remove the item?"), QMessageBox::Yes | QMessageBox::No, this); msg.exec(); if (msg.clickedButton() != msg.button(QMessageBox::Yes)) { return; } m_vScanParams.erase(m_vScanParams.begin() + index); // TODO 保存m_vScanParams ui->tableWidget->removeRow(index); }