You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++/Qt中如何中断函数执行?教程模式旋转停止需求

解决方案

你当前通过循环创建大量QTimer::singleShot的方案存在核心问题:这些单次定时器一旦被Qt事件循环调度,就无法批量取消,只能逐个追踪并停止,操作繁琐且低效。更合理的做法是使用重复QTimer来实现可控的平滑旋转,同时支持随时中断。

实现步骤

  1. 添加定时器成员变量
    在myWidget类的头文件中声明定时器和角度记录变量:
class myWidget : public QWidget {
    Q_OBJECT
private:
    QTimer* m_rotationTimer;
    float m_rotationAngle = 0.0f; // 记录当前旋转角度
    // ... 其他成员
};
  1. 初始化定时器
    在构造函数中完成定时器的初始化、间隔设置和信号槽连接:
myWidget::myWidget(QWidget* parent) : QWidget(parent) {
    m_rotationTimer = new QTimer(this);
    m_rotationTimer->setInterval(25); // 25ms触发一次
    connect(m_rotationTimer, &QTimer::timeout, this, &myWidget::rotateCameraAutomatic);
}
  1. 改写启动旋转逻辑
    替换原有的rotateCamera函数,只需启动重复定时器即可:
void myWidget::rotateCamera() {
    m_rotationAngle = 0.0f; // 可选:重置角度从头开始旋转
    m_rotationTimer->start();
}
  1. 实现旋转与视图刷新
    在rotateCameraAutomatic中处理角度更新并触发GL视图刷新:
void myWidget::rotateCameraAutomatic() {
    m_rotationAngle += 5.0f;
    if (m_rotationAngle >= 360.0f) {
        m_rotationAngle -= 360.0f; // 避免角度数值无限增大
    }
    // 更新GL相机旋转角度,调用视图刷新方法
    updateGL(); // 根据你使用的GL组件调整刷新接口
}
  1. 添加停止旋转的触发逻辑
    在停止按钮的点击槽函数中,直接停止定时器即可中断旋转:
void myWidget::on_stopTutorialBtn_clicked() {
    m_rotationTimer->stop();
}

方案优势

  • 支持随时启停,无需追踪大量单次定时器
  • 代码结构简洁,内存占用更低
  • 旋转逻辑可灵活调整(比如中途修改旋转速度、角度增量)

额外注意事项

  • 由于定时器设置了父对象为this,Qt会自动管理其内存,无需手动在析构函数中删除
  • 如果需要旋转到指定角度后自动停止,可在rotateCameraAutomatic中判断角度达到目标值时调用m_rotationTimer->stop()

内容的提问来源于stack exchange,提问作者Garance

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:02:22