tool->定时器函数

data需要为对象类型 使用浅拷贝概念
使用 timeout 递归实现
待实现 .timeout 应带有时间 传递

使用方法
// init
var default_count = 30;
var timer = timer({time: default_count}, function() {
      this.data.time--;
      // 这里写每次 多少秒调用的处理
}, function() {
    if (this.data.time <= 0) {
      // 每次调用是否继续的判断 true: 终止
      return true;
    }
    else
        return false;
}, 1000)

// run
timer.timeout()
原文件
/**
      data: 传入的闭包参数
      func_logic: run逻辑
      func_end: run判断
      time: 延迟run时间
*/
var timer = function(data, func_logic, func_end, time) {
    function timeout() {
        setTimeout(()=>{
            func_logic.call(this);

            // 返回 true 则终止 递归
            if(!func_end.call(this)) {
                this.timeout();
            }
        }, time);
    }

    return {
        data,
        timeout,
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以给你讲解一下如何使用Qt C++中的QChart来实现你的需求,同时提供一份示例代码供参考。 首先,你需要在Qt中安装Qt Chart模块,可以在Qt Maintenance Tool中进行安装。安装完成后,在.pro文件中添加如下语句: ``` QT += charts ``` 然后,在你的窗口类中添加一个QChartView成员变量,用于显示图表: ```cpp class MyWindow : public QMainWindow { Q_OBJECT public: MyWindow(QWidget *parent = nullptr); private: QChartView *m_chartView; }; ``` 在构造函数中,我们需要初始化QChartView,并将其设置为窗口的中心部件: ```cpp MyWindow::MyWindow(QWidget *parent) : QMainWindow(parent) { // 创建图表 QChart *chart = new QChart; chart->setTitle("Sensor Data"); // 创建坐标轴 QDateTimeAxis *axisX = new QDateTimeAxis; axisX->setTitleText("Time"); axisX->setFormat("hh:mm:ss"); axisX->setTickCount(10); // 设置刻度数量 chart->addAxis(axisX, Qt::AlignBottom); QValueAxis *axisY = new QValueAxis; axisY->setTitleText("Value"); chart->addAxis(axisY, Qt::AlignLeft); // 设置图例 chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); // 创建曲线 QSplineSeries *series = new QSplineSeries; series->setName("Sensor1"); chart->addSeries(series); // 将曲线绑定到坐标轴 series->attachAxis(axisX); series->attachAxis(axisY); // 创建QChartView,并设置为中心部件 m_chartView = new QChartView(this); m_chartView->setRenderHint(QPainter::Antialiasing); m_chartView->setChart(chart); setCentralWidget(m_chartView); } ``` 以上代码创建了一个曲线图,在窗口中心部件中显示,并初始化了坐标轴、图例、曲线等基本元素。 接下来,我们需要从数据源中获取传感器数据,并将其添加到曲线中。为了简单起见,这里我们使用了一个随机数生成器来模拟传感器数据: ```cpp void MyWindow::updateData() { // 生成随机数据 static qreal x = QDateTime::currentDateTime().toMSecsSinceEpoch() / 1000.0; qreal y = qrand() % 100; // 将数据添加到曲线中 QSplineSeries *series = qobject_cast<QSplineSeries*>(m_chartView->chart()->series().at(0)); series->append(x, y); // 更新坐标轴范围 QDateTimeAxis *axisX = qobject_cast<QDateTimeAxis*>(m_chartView->chart()->axes(Qt::Horizontal).at(0)); axisX->setRange(QDateTime::fromMSecsSinceEpoch(x * 1000), QDateTime::fromMSecsSinceEpoch((x + 10) * 1000)); QValueAxis *axisY = qobject_cast<QValueAxis*>(m_chartView->chart()->axes(Qt::Vertical).at(0)); axisY->setRange(0, 100); // 更新时间戳 x += 1.0; } ``` 以上代码定义了一个updateData()槽函数,用于更新曲线数据。我们在其中生成随机数据,并将其添加到曲线中,同时更新坐标轴范围和时间戳。 最后,我们需要在窗口中添加一些控件,用于设置传感器和时间段。这里我们使用了QComboBox和QDateTimeEdit控件: ```cpp MyWindow::MyWindow(QWidget *parent) : QMainWindow(parent) { // ... // 创建传感器选择框 QComboBox *sensorComboBox = new QComboBox; sensorComboBox->addItem("Sensor1"); sensorComboBox->addItem("Sensor2"); connect(sensorComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onSensorChanged(int))); // 创建时间段选择框 QDateTimeEdit *startTimeEdit = new QDateTimeEdit(QDateTime::currentDateTime()); QDateTimeEdit *endTimeEdit = new QDateTimeEdit(QDateTime::currentDateTime().addSecs(3600)); connect(startTimeEdit, SIGNAL(dateTimeChanged(QDateTime)), this, SLOT(onTimeChanged())); connect(endTimeEdit, SIGNAL(dateTimeChanged(QDateTime)), this, SLOT(onTimeChanged())); // 创建布局 QGridLayout *layout = new QGridLayout; layout->addWidget(sensorComboBox, 0, 0); layout->addWidget(new QLabel("Start Time:"), 1, 0); layout->addWidget(startTimeEdit, 1, 1); layout->addWidget(new QLabel("End Time:"), 2, 0); layout->addWidget(endTimeEdit, 2, 1); QWidget *widget = new QWidget; widget->setLayout(layout); setCentralWidget(widget); } ``` 以上代码创建了一个传感器选择框和一个时间段选择框,并将它们添加到窗口中。我们还定义了两个槽函数onSensorChanged()和onTimeChanged(),用于响应控件的变化: ```cpp void MyWindow::onSensorChanged(int index) { // 修改曲线名称 QSplineSeries *series = qobject_cast<QSplineSeries*>(m_chartView->chart()->series().at(0)); series->setName("Sensor" + QString::number(index + 1)); } void MyWindow::onTimeChanged() { // 获取时间段 QDateTime startTime = qobject_cast<QDateTimeEdit*>(sender())->dateTime(); QDateTime endTime = qobject_cast<QDateTimeEdit*>(sender())->dateTime(); // TODO: 从数据源中获取指定时间段和传感器的数据,并更新曲线 } ``` 以上代码根据控件的变化,修改了曲线名称或者获取时间段并从数据源中获取数据,并更新曲线。 完整代码如下: ```cpp #include <QtWidgets> class MyWindow : public QMainWindow { Q_OBJECT public: MyWindow(QWidget *parent = nullptr); private slots: void updateData(); void onSensorChanged(int index); void onTimeChanged(); private: QChartView *m_chartView; }; MyWindow::MyWindow(QWidget *parent) : QMainWindow(parent) { // 创建图表 QChart *chart = new QChart; chart->setTitle("Sensor Data"); // 创建坐标轴 QDateTimeAxis *axisX = new QDateTimeAxis; axisX->setTitleText("Time"); axisX->setFormat("hh:mm:ss"); axisX->setTickCount(10); // 设置刻度数量 chart->addAxis(axisX, Qt::AlignBottom); QValueAxis *axisY = new QValueAxis; axisY->setTitleText("Value"); chart->addAxis(axisY, Qt::AlignLeft); // 设置图例 chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); // 创建曲线 QSplineSeries *series = new QSplineSeries; series->setName("Sensor1"); chart->addSeries(series); // 将曲线绑定到坐标轴 series->attachAxis(axisX); series->attachAxis(axisY); // 创建QChartView,并设置为中心部件 m_chartView = new QChartView(this); m_chartView->setRenderHint(QPainter::Antialiasing); m_chartView->setChart(chart); setCentralWidget(m_chartView); // 创建传感器选择框 QComboBox *sensorComboBox = new QComboBox; sensorComboBox->addItem("Sensor1"); sensorComboBox->addItem("Sensor2"); connect(sensorComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onSensorChanged(int))); // 创建时间段选择框 QDateTimeEdit *startTimeEdit = new QDateTimeEdit(QDateTime::currentDateTime()); QDateTimeEdit *endTimeEdit = new QDateTimeEdit(QDateTime::currentDateTime().addSecs(3600)); connect(startTimeEdit, SIGNAL(dateTimeChanged(QDateTime)), this, SLOT(onTimeChanged())); connect(endTimeEdit, SIGNAL(dateTimeChanged(QDateTime)), this, SLOT(onTimeChanged())); // 创建布局 QGridLayout *layout = new QGridLayout; layout->addWidget(sensorComboBox, 0, 0); layout->addWidget(new QLabel("Start Time:"), 1, 0); layout->addWidget(startTimeEdit, 1, 1); layout->addWidget(new QLabel("End Time:"), 2, 0); layout->addWidget(endTimeEdit, 2, 1); QWidget *widget = new QWidget; widget->setLayout(layout); setCentralWidget(widget); // 定时器更新数据 QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(updateData())); timer->start(1000); } void MyWindow::updateData() { // 生成随机数据 static qreal x = QDateTime::currentDateTime().toMSecsSinceEpoch() / 1000.0; qreal y = qrand() % 100; // 将数据添加到曲线中 QSplineSeries *series = qobject_cast<QSplineSeries*>(m_chartView->chart()->series().at(0)); series->append(x, y); // 更新坐标轴范围 QDateTimeAxis *axisX = qobject_cast<QDateTimeAxis*>(m_chartView->chart()->axes(Qt::Horizontal).at(0)); axisX->setRange(QDateTime::fromMSecsSinceEpoch(x * 1000), QDateTime::fromMSecsSinceEpoch((x + 10) * 1000)); QValueAxis *axisY = qobject_cast<QValueAxis*>(m_chartView->chart()->axes(Qt::Vertical).at(0)); axisY->setRange(0, 100); // 更新时间戳 x += 1.0; } void MyWindow::onSensorChanged(int index) { // 修改曲线名称 QSplineSeries *series = qobject_cast<QSplineSeries*>(m_chartView->chart()->series().at(0)); series->setName("Sensor" + QString::number(index + 1)); } void MyWindow::onTimeChanged() { // 获取时间段 QDateTime startTime = qobject_cast<QDateTimeEdit*>(sender())->dateTime(); QDateTime endTime = qobject_cast<QDateTimeEdit*>(sender())->dateTime(); // TODO: 从数据源中获取指定时间段和传感器的数据,并更新曲线 } int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWindow window; window.show(); return app.exec(); } #include "main.moc" ``` 在onTimeChanged()槽函数中,你需要根据传感器和时间段从数据源中获取数据,并更新曲线。这部分代码需要根据你的具体需求进行编写,这里就不再赘述了。 希望这份代码能够帮助到你,如果你还有什么问题,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值