使用滑块更改 QTimer 的间隔超时

2024-03-02

timer = new QTimer(this);
timer->setInterval(50);
QPushButton *start = new QPushButton("Start/Stop", this);
start->setText("Start/Stop");
layout->addWidget(start);
connect(start, &QPushButton::clicked, this, [this]() {
   if (!timer->isActive()) {
      timer->start();
   } else {
      timer->stop();
          }
  });
connect(timer, &QTimer::timeout, this, [&slider, sliderDisplay]() {
//increment slider value until at max, then reset to min
}

如何使用另一个滑块来更改 QTimer 发出的超时间隔?我尝试过使用 setInterval 但似乎一旦设置了时间间隔就无法更改。最好的方法是删除这个 QTimer 并每次都以指定的时间间隔创建一个新的 QTimer 吗?


OP声称

如何使用另一个滑块来更改 QTimer 发出的超时间隔?我尝试过使用 setInterval 但似乎一旦设置了时间间隔就无法更改。

我对这个说法有点想知道,因为我可以发誓你可以随时更改间隔。

我会考虑的唯一限制是:在下一次超时发生之前可能不会考虑新设置的间隔。 (通常,我使用单次计时器或间隔较小的计时器,这样您就不会注意到差异。)

在玩我的演示时,我得到的印象是一个调用QTimer::setInterval()重新开始间隔。

不幸的是,医生。的QTimer::setInterval() https://doc.qt.io/qt-5/qtimer.html#interval-prop没有明确提到这种行为,除了:

设置活动定时器的间隔会更改其timerId()。

谢谢@斯科普查诺夫 https://stackoverflow.com/questions/64300917/change-interval-timeouts-of-qtimer-with-slider/64301362?noredirect=1#comment113716591_64301362谁查看了源代码(我太懒了)。

QTimer::setInterval() https://code.woboq.org/qt5/qtbase/src/corelib/kernel/qtimer.cpp.html#_ZN6QTimer11setIntervalEi:

void QTimer::setInterval(int msec)
{
    inter = msec;
    if (id != INV_TIMER) {                        // create new timer
        QObject::killTimer(id);                        // restart timer
        id = QObject::startTimer(msec, Qt::TimerType(type));
    }
}

因此,实际上,在计时器运行时设置间隔,它会终止当前正在运行的计时器并重新启动一个新计时器。

My MCVE https://stackoverflow.com/help/minimal-reproducible-example用于演示 –testQTimer.cc:

// Qt header:
#include <QtWidgets>

// main application
int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  QWidget qWinMain;
  qWinMain.setWindowTitle("Test QTimer");
  QFormLayout qForm;
  QSlider qSliderInterval(Qt::Horizontal);
  qSliderInterval.setRange(100, 1000);
  qForm.addRow("Interval: ", &qSliderInterval);
  QSlider qSliderStep(Qt::Horizontal);
  qSliderStep.setRange(1, 10);
  qForm.addRow("Step: ", &qSliderStep);
  QPushButton qBtnStartStop("Start / Stop");
  qForm.addRow("Timer:", &qBtnStartStop);
  QSlider qSliderAnim(Qt::Horizontal);
  qForm.addRow("Animation:", &qSliderAnim);
  qSliderAnim.setRange(0, 100);
  qWinMain.setLayout(&qForm);
  qWinMain.show();
  // setup timer
  QTimer qTimer;
  qTimer.setInterval(qSliderInterval.value());
  // install signal handlers
  QObject::connect(&qSliderInterval, &QSlider::valueChanged,
    [&](int value) { qTimer.setInterval(value); });
  QObject::connect(&qBtnStartStop, &QPushButton::clicked,
    [&]() {
      if (qTimer.isActive()) qTimer.stop();
      else qTimer.start();
    });
  QObject::connect(&qTimer, &QTimer::timeout,
    [&]() {
      int value = qSliderAnim.value() + qSliderStep.value();
      if (value > qSliderAnim.maximum()) {
        value -= qSliderAnim.maximum() - qSliderAnim.minimum();
      }
      qSliderAnim.setValue(value);
    });
  // runtime loop
  return app.exec();
}

Output:

Qt Version: 5.13.0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用滑块更改 QTimer 的间隔超时 的相关文章

随机推荐

  • 使用 vector 作为缓冲区,而不在 resize() 上对其进行初始化

    我想用vector
  • Powershell:确定进程是 32 位还是 64 位

    有没有办法确定给定的进程 ID 是 32 位进程还是 64 位进程 我正在使用 Powershell v3 0 尝试这个 Add Type MemberDefinition DllImport kernel32 dll SetLastErr
  • 改造响应保留旧数据并将新数据添加到 editText 搜索的数据中

    我正在使用 editText 搜索从 API 获取数据 第一次搜索时 它按预期工作 但在第二次搜索时 它不会显示唯一的新响应 而是保留旧响应并在其末尾添加新响应 它的行为就像缓存以前的一样 我该如何修复该问题以仅显示最后一个搜索词结果 分段
  • Google 云端硬盘文件列表:500 错误

    对于我们的应用程序 我们使用具有 2 足授权的 Google Drive SDK 我们使用 Drive SDK 很长时间了 但今天我们遇到了 Files list API 的新问题 https developers google com d
  • 用于一对多查找的 Cassandra 数据建模

    考虑存储用户及其联系人的问题 大约有一亿用户 每个用户有几百个联系人 平均联系人大小为 1kb 可能有些用户拥有太多联系人 gt 5000 并且可能有一些联系人比平均 1kb 大得多 例如 10 倍 用户会主动添加联系人 但很少会删除联系人
  • 使用 Ansible 配置 Jenkins 2.0

    我使用 Ansible 来配置我们的服务器 我安装了 Jenkins 2 0 但当我打开 Web UI 时 它变成了启动配置 我如何使用 Ansible 或 shell 或 jenkins cli 来做到这一点 CentOS 7 Ansib
  • 登录时从用户集合中获取用户数据

    我目前正在开发一个在客户端初始化了 firebase 的应用程序 当用户通过 firebase 登录时 我想从 firestore 获取用户的数据 我目前正在这样做onAuthStateChanged侦听器并成功获取用户 我想知道这是否是获
  • 套接字连接超时:规范在哪里?

    我的工作环境是我的局域网 下面的代码示例是用 Java 语言编写的 但我的问题是关于 TCP 而不是编程 我遇到过以下连接超时的情况 2 ms when connection established 当主机处于活动状态但未侦听指定套接字端口
  • emacs lisp 中的 let 和 flet

    我不知道你是否会称其为规范公式 但为了绑定本地函数 GNU 手册建议我使用 flet defun adder with flet x flet f x x 3 f x 然而 我偶然尝试了 在玩了一会儿Scheme之后 下面的表达式 其中我使
  • 将给定字符串转换为具有给定子字符串的回文

    给定字符串 S1 和字符串 S2 将字符串 S1 转换为回文字符串 例如 S2 是该回文字符串的子字符串 S1 上允许的唯一操作是将任何字符替换为任何其他字符 找出所需的最少操作次数 我已经编写了这段代码 可以计算需要使用常规字符串进行多少
  • AngularJS CORS 问题

    我已经搜索了 200 多个网站 也许有点夸张 但也不是很多 来了解如何使用 angularjs 处理 cors 我们有一台运行 Web API 服务器的本地计算机 我们正在开发一个调用 API 获取数据的客户端 当从服务器运行客户端时 我们
  • 计算多维数组中的元素数量

    我有这个代码 loadData function jsonArray var id this attr id for var i in jsonArray id tbody append tr class entry details pag
  • 声音匹配/搜索

    实际上声音匹配 搜索的当前技术水平如何 我目前正在远程参与规划一个 Web 应用程序 该应用程序将包含并公开录制的短音频剪辑 最多 3 5 秒 人名 的数据库 有人提出了是否有可能实现基于用户语音输入的搜索的问题 我的直觉告诉我 从计算和算
  • 如何在同一服务器环境下运行PHP和Tomcat?

    不久前在 AskUbuntu 上问过这个问题 https askubuntu com questions 630897 apache httpd backed by both tomcat and php https askubuntu c
  • TypeScript:类型“EventTarget & Element”上不存在属性“checked”。为什么它不存在?

    我收到此错误 错误 17 35 TS2339 类型 EventTarget Element 上不存在属性 checked 但这绝对是不可能的错误 因为 React 文档说checked确实存在于target的复选框 https reactj
  • 对复合对象数组以及日期范围进行 Elasticsearch 查询

    您好 我有一个问题 如何为具有日期范围和附加字段参数的嵌套复合对象创建弹性搜索查询 如下所示 name A availability partial true dates gte 2020 12 01 lte 2020 12 02
  • 在 Java 8 中使用 lambda 出现意外错误

    我正在使用 Java 8 Update 20 32 位 Maven 3 2 3 Eclipse Luna Build id 20140612 0600 32 位 开始使用 lambda 后 我的项目中的一些类开始在 Maven 中报告编译错
  • Javascript 前进后退按钮

    我在我正在开发的网站的主页上使用 s3Slider javascript 幻灯片 http alexisparkinn com http alexisparkinn com 我真的很喜欢这张幻灯片 但它无法让用户转到下一张或上一张图像 我怎
  • 有没有办法对VBA中的代码施加时间限制?

    我想知道是否有人有对代码段施加时间限制的经验 我已经用 VBA 将搜索引擎编程到 Excel 电子表格中 并且有一段代码可以删除重复的结果 现在 如果给出最模糊的搜索条件 这部分有时可能会持续相当长的时间 所以我想对这个操作施加一个时间限制
  • 使用滑块更改 QTimer 的间隔超时

    timer new QTimer this timer gt setInterval 50 QPushButton start new QPushButton Start Stop this start gt setText Start S