我如何在 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);
}
我写了这段代码,所以我可以监控一个 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);
}