上篇QT 下拉菜单设置参数 起始端口/结束端口/线程数量 端口扫描4-CSDN博客
在扫描结束后设置Scan按钮为可用,并提示扫描完成
在 MainWindow
类中添加一个成员变量来跟踪正在进行的扫描任务数量:
在 MainWindow
的构造函数中初始化 activeScanTasks
:
在按下scan之后重置任务计数
每扫描一次就++
扫描完成后会发送信号给槽函数,在槽函数中实现提示消息和重启按钮功能
每完成一个扫描任务tasks--
全部完成之后task==0
在扫描时显示扫描进度
在 Qt Designer 中,向 MainWindow
添加一个 QProgressBar
,并设其 objectName
为 progressBar
。确保它的范围是从 0 到 100。
赋初值
计算实际值
点击scan重置进度条
扫描完成之后,发送信号-->在 recv_result
槽函数中,更新进度条的值
使用 invokeMethod 确保在主线程中更新 UI
最初将continue按钮隐藏,点击stop按钮之后之后显示continue按钮,按下continue按钮之后继续扫描
点击scan时
void MainWindow::on_stopButton_clicked()
{ // 停止所有正在运行的任务 threadpool->clear(); // 清理线程池中未执行完的任务 ui->pushButton_Scan->setEnabled(true); // 重新启用扫描按钮 isPaused = true; // 设置为暂停状态 ui->pushButton_Continue->setVisible(true); // 显示继续按钮
}
void MainWindow::on_pushButton_Stop_clicked()
{// 停止所有正在运行的任务 threadpool->clear(); // 清理线程池中未执行完的任务 ui->pushButton_Scan->setEnabled(true); // 重新启用扫描按钮 isPaused = true; // 设置为暂停状态 ui->pushButton_Continue->setVisible(true); // 显示继续按钮
}
void MainWindow::on_pushButton_Continue_clicked()
{ isPaused = false; // 设置为继续扫描状态 ui->pushButton_Continue->setVisible(false); // 隐藏继续按钮 ui->pushButton_Stop->setEnabled(true); // 启用停止按钮 // 继续扫描未完成的任务 for (int i = currentPort; i < totalPorts; ++i) { if (!isPaused) { // 检查是否已暂停 ScanTask *task = new ScanTask(ui->lineEdit_IP->text(), i); connect(task, &ScanTask::send_scan_signal, this, &MainWindow::recv_result); threadpool->start(task); activeScanTasks++; currentPort++; // 更新当前扫描的端口 QThread::msleep(12); } else { break; // 如果已暂停,退出循环 } }
}
每次扫描完成(一次),槽函数中更新当前扫描的端口
槽函数void MainWindow::recv_result(int port, bool isOpen) 中,在扫描完成后变换暂停状态