如何比较文本文件中的时间范围与用户在qt中输入的时间范围?

时间:2017-09-10 12:59:38

标签: c++ qt qt5 qtextedit qfile

我有text file如下:

Option

代码如下:

05:59:57 - [0x1010001]05:59:57 - (2576) WRITING TO NON-VOLATILE MEMORY IS DONE
06:00:00 - [0x1010001]06:00:00 - (23371)  T_Check_Buddy !!!  
06:00:00 - DMA:310127952,01,REQ:BRDTIM 82 07 83 29 05 0f 04 12 06 00 
06:00:00 - 
06:00:00 - EvmTbl............
06:00:00 - Maintenancing & Filling VboxTbl...DONE
06:00:01 - DMA:310128070,01,IND:KTSPER 96 10 85 fc 00 28 58 
06:00:01 - DMA:310128071,01,REQ:KTSIDK 82 10 85 fc 81 00 47 02 
06:00:01 - DMA:310128091,01,IND:KTSPER 96 10 86 fc 00 28 58 
06:00:01 - DMA:310128091,01,REQ:KTSIDK 82 10 86 fc 81 00 47 02 
06:00:02 - SIP:310129384, REQ:     KINFO     To:1800 To-Host:192.168.178.230 Ktext: 02 78 0e
06:00:30 - [0x1010001]06:00:30 - (23371)  T_Check_Buddy !!!  
06:00:32 - SIP:310159385, REQ:     KINFO     To:1800 To-Host:192.168.178.230 Ktext: 02 78 0e
06:00:46 - IPT:310173571,255,IND: CONFIG 87 03 4c 43 4e

我在表单中执行了按钮和lineedits。之后,我分割了时间范围hh:mm:ss format。因为我必须对时间范围进行错误检查。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
#include<QFile>
#include<QTextStream>
#include<QStringList>
#include<QDebug>
#include<QMessageBox>

using namespace std;

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

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

我读了文本文件和拆分文件。我需要将文本文件中的时间范围与用户输入的时间范围进行比较。

void MainWindow::on_pushButton_3_clicked()
{
   QString output;
   QString line;
   QStringList splitted;
   QString times;

   int sayac1=0,sayac2=0;
   bool control1=false;
   bool control2=false;


   QString firsttime=ui->lineEdit->text();  //first time range that entered 
   by user.
   QStringList list1=firsttime.split(":");  //Girilen time split edildi.

   if (list1.size() < 3)
     QMessageBox::warning(this,"LIST","ALANLAR BOŞ BIRAKILAMAZ!");

   QString hour1=list1[0];
   hour1.toInt();

   QString minute1=list1[1];
   minute1.toInt();

   QString second1=list1[2];
   second1.toInt();


   QString secondtime=ui->lineEdit_2->text();  //second time range that 
   entered by user. 
   QStringList list2=secondtime.split(":");    //Girilen aralık split 
   edildi.

   if(list2.size() < 3)
     QMessageBox::warning(this,"LIST","ALANLAR BOŞ BIRAKILAMAZ!");


  QString hour2=list2[0];
  hour2.toInt();

  QString minute2=list2[1];
  minute2.toInt();

  QString second2=list2[2];
  second2.toInt();

在下面的代码中,我按照上面提到的那样进行了错误检查。并且,我尝试在指定的时间间隔显示记录。但是当我运行代码时,我创建的textbrowser中没有任何内容显示记录。我不明白为什么会发生这种情况。此外,没有错误发生。例如,用户输入05:59:57到第一个lineedit和06:00:46到第二个lineedit.Then用户点击按钮以此时间间隔显示记录。我想显示记录从05:59:57到06:00:46.但是,textbrowser中没有记录。似乎没有。我怎样才能解决这个问题?

    QFile file("C:\\kaynak\\naile.txt");

       if(file.open(QIODevice::ReadOnly | QIODevice::Text)){

           QTextStream in(&file);

           while(!in.atEnd())
           {

               line = in.readLine()+"\n";
               output.append(line);


               if(line.contains(" - ")){
                   splitted=line.split(" - ");
                   times=times+" "+splitted[0];
               }

               if(splitted[0]!=firsttime && control1==false){
                  sayac1 = sayac1+1;
               }
               else
                  control1=true;


               if(splitted[0]!=secondtime && control2==false){
                  sayac2++;
               }
               else
                  control2=true;

}

1 个答案:

答案 0 :(得分:0)

为了比较我们必须使用QTime类的时间,这个类提供了实现时间比较运算符。除此之外,建议使用QTimeEdit为这些参数提供合适的小部件,因此我建议您更改它们而不是使用QLineEdit

必须建立适当的格式,为此完成以下工作:

#define FORMAT  "hh:mm:ss"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->fromTimeEdit->setDisplayFormat(FORMAT);
    ui->toTimeEdit->setDisplayFormat(FORMAT);
    ui->toTimeEdit->setTime(QTime::fromString("23:59:59", FORMAT));
}

然后在按下按钮时调用的插槽中,我们执行过滤的任务,我们得到时间,如果限制足够,我们会进行一些检查。在我们读取文件后,我们得到前8个字符,我们及时转换它,如果它是有效的,它是在我们更改标志的时间之间,如果相反它是无效的,我们保持原样,所有上述在以下代码中实现:

void MainWindow::on_pushButton_clicked()
{
    const QTime from =  ui->fromTimeEdit->time();
    const QTime to = ui->toTimeEdit->time();

    bool copyLog = false;
    if(from <= to){
        QFile file("/path/of/kaynak.log");
        ui->textEdit->clear();
        if(file.open(QIODevice::ReadOnly | QIODevice::Text)){
            QTextStream in(&file);
            while(!in.atEnd()){
                const QString line = in.readLine();
                const QTime timeLog = QTime::fromString(line.left(8), FORMAT);
                if(timeLog.isValid()){
                    copyLog = timeLog >= from && timeLog <= to;
                }
                if(copyLog){
                    ui->textEdit->append(line);
                    QApplication::processEvents();
                }
            }
        }
    }
}

下图显示了结果:

enter image description here

完整示例可在以下link

中找到