[英]How can I put in a loop the change of a label in QT(c++)
我写了这段代码,所以我可以监控一个 ip 地址。 我正在使用 Qt 并且我想做它,所以当我按下按钮启动时,它将 ping ip 并返回一个值,如 1,这意味着它是最小 ping 或其他值。 问题是我不能循环更改 label。 我试过 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 function 而不是调用timer.callOnTimeout
:
connect(&timer, &QTimer::timeout, this, [this]() {
.... your code
} );
你也不需要在你的 lambda function 中再次启动你的定时器,因为你启动它一次,它会在你调用timer.stop()
之前连续运行。
请记住,每次按下按钮时创建一个 Timer 都会创建同时运行的多个 Timer 实例,并会导致过载或 memory 过度使用。 尝试更有效地使用它。
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.