QT实现 端口扫描暂停和继续功能 3
上篇QT给端口扫描工程增加线程2-CSDN博客
为按钮pushButton_Stop添加clicked事件,功能为暂停扫描,并在暂停后显示继续按钮,点击继续按钮之后继续扫描
1.更新UI
添加继续按钮
点击转到槽则会自动声明
2. 更新 MainWindow.h
需要新增的部分
private slots: void on_pushButton_Stop_clicked(); // 暂停按钮点击事件 void on_pushButton_Continue_clicked(); // 继续按钮点击事件 private: bool isPaused; // 用于跟踪扫描是否暂停
3. 更新 MainWindow.cpp
在 MainWindow.cpp
中实现暂停和继续的功能。
3.1 初始化成员变量
在构造函数中初始化 isPaused
变量,并设置 pushButton_Continue
为隐藏状态:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), isPaused(false) // 初始化为未暂停状态
{ ui->setupUi(this); ui->pushButton_Continue->setVisible(false); // 隐藏继续按钮
}
3.2 实现暂停功能
在 on_pushButton_Stop_clicked()
槽函数中,设置 isPaused
为 true
,并隐藏暂停按钮,显示继续按钮:
void MainWindow::on_pushButton_Stop_clicked() { isPaused = true; // 设置为暂停状态 ui->pushButton_Stop->setEnabled(false); // 禁用暂停按钮 ui->pushButton_Continue->setVisible(true); // 显示继续按钮
}
3.3 实现继续功能
在 on_pushButton_Continue_clicked()
槽函数中,设置 isPaused
为 false
,并隐藏继续按钮,启用暂停按钮:
void MainWindow::on_pushButton_Continue_clicked() { isPaused = false; // 设置为继续状态 ui->pushButton_Stop->setEnabled(true); // 启用暂停按钮 ui->pushButton_Continue->setVisible(false); // 隐藏继续按钮 // 继续扫描的逻辑 // 这里可以调用一个函数来继续扫描 continueScanning();
}
4. 修改扫描逻辑
在 MyThread
类中,您需要修改扫描逻辑,以便在扫描过程中检查 isPaused
状态。如果扫描被暂停,则线程应等待,直到继续按钮被点击。
4.1更新 MyThread.h
4.2更新 MyThread.cpp
在 MyThread.cpp
中实现 setPaused
方法,并在 run()
方法中检查 isPaused
状态:
void MyThread::setPaused(bool paused) { isPaused = paused; // 更新暂停状态
}
while (isPaused) { msleep(100); // 暂停扫描,避免 CPU 占用过高 }
4.3在主窗口中管理暂停和继续
在点击暂停和继续按钮时调用 setPaused
方法。
5.连接信号和槽
因为先点击扫描才会有后面的暂停和继续,所以我选择把这个步骤放到扫描按钮点击事件处理函数
void MainWindow::on_pushButton_Scan_clicked()中
connect(ui->pushButton_Stop, &QPushButton::clicked, this, &MainWindow::on_pushButton_Stop_clicked);
connect(ui->pushButton_Continue, &QPushButton::clicked, this, &MainWindow::on_pushButton_Continue_clicked);