我如何在 QT(c++) 中循环更改标签

How can I put in a loop the change of a label in QT(c++)

我写了这段代码,所以我可以监控一个 ip 地址。我正在使用 Qt 并且我想实现它,所以当我按下按钮开始时它会 ping ip 和 return 一个值,比如 1,这意味着它是最小 ping 或其他。问题是我不能在循环中更改标签。我试过 QTimer 但我无法弄清楚。这是我写的代码:

#include "ui_mainwindow.h"
#include<iostream>
#include<vector>
#include<string>
#include<ctime>
#include<fstream>
#include<QMessageBox>
#include<Windows.h>
#include<QTimer>
#include<QDebug>
using namespace std;


int check(string file){
    string a,b;
    int x,c;
    vector<int>ms;
    ifstream fin(file);
    while(!fin.eof()){
        getline(fin,a);
        if(a[0]=='P'){
            if(a=="PING: transmit failed. General failure. ")
                return -1;
        }
        if(a[0]=='R'){
            if(a=="Request timed out.")
                return -1;
            for(unsigned int i=0;i<a.size();i++){
                if(a[i]=='t'){
                    x=i+4;
                    while(a[x]!='m'){
                        b+=a[x];
                        x++;
                    }
                c=stoi(b);
                ms.push_back(c);
                }
            }
        }
    }
    for(unsigned int i=0;i<ms.size();i++){
        if(ms[i]<20)
            return 0;
        else if(ms[i]>20 && ms[i]<60)
            return 1;
        else
            return 2;
    }
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked(){
    ofstream fout("traffic.txt");
    string file_name="result.txt";
    QString a="ping ";
    QString b = ui->lineEdit->text();
    string result;
    int j=0;
    a+=b;
    string x=a.toStdString();
    QTimer timer;
    constexpr int interval =10;
    timer.callOnTimeout([&]{
    //qInfo()<<"ok";
      system((x+">" + file_name).c_str());
        //time_t now = time(0);
        //tm *ltm = localtime(&now);
        j=check(file_name);
        //Sleep(3000);
        if(j==0)
           ui->label_2->setText("ok");
        else if(j==1)
            ui->label_2->setText("minimum");
        else if(j==-1)
            QMessageBox::critical(this,"Error","request time out.Check the ip");
        else
            QMessageBox::critical(this,"bad","bad");
            //Sleep(30000);

           timer.start(interval);

    });
    timer.start(interval);
   }

您应该将定时器超时信号连接到您的 lambda 函数,而不是调用 timer.callOnTimeout:

connect(&timer, &QTimer::timeout, this, [this]() {
    .... your code
} );

你也不需要在你的 lambda 函数中再次启动你的计时器,因为因为你启动它一次,它会 运行 连续 运行 直到你调用 timer.stop()

请记住,每次按下按钮时都会创建一个定时器,这会同时创建 运行 多个定时器实例,并会导致过载或内存过度使用!尝试更有效地使用它。

void MainWindow::on_pushButton_clicked(){
    ofstream fout("traffic.txt");
    QTimer timer;
    constexpr int interval =10;

    connect(&timer, &QTimer::timeout, this, [this]() {
    //qInfo()<<"ok";
    string file_name="result.txt";
    QString a="ping ";
    QString b = ui->lineEdit->text();
    string result;
    int j=0;
    a+=b;
    string x=a.toStdString();
      system((x+">" + file_name).c_str());
        //time_t now = time(0);
        //tm *ltm = localtime(&now);
        j=check(file_name);
        //Sleep(3000);
        if(j==0)
           ui->label_2->setText("ok");
        else if(j==1)
            ui->label_2->setText("minimum");
        else if(j==-1)
            QMessageBox::critical(this,"Error","request time out.Check the ip");
        else
            QMessageBox::critical(this,"bad","bad");
            //Sleep(30000);    
    });

    timer.start(interval);
   }