Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Portuguese
  4. [Duvida] QFile read constante
Forum Updated to NodeBB v4.3 + New Features

[Duvida] QFile read constante

Scheduled Pinned Locked Moved Portuguese
4 Posts 3 Posters 2.5k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    digimonkey
    wrote on last edited by
    #1

    Bom dia,
    comecei a programar a pouco tem Qt e agora deparo-me com uma duvida que gostaria de saber se alguem mais experiente sabe como resolver.

    Basicamente estou a fazer leitura da ultima linha de um ficheiro TXT para uma caixa de texto, ao pressionar um botao. O problema e que eu quero que o programa nao pare de actualizar novas entradas na ultima linha do ficheiro de texto entao o ficheiro nao for fechado.

    Por exemplo, sendo este o meu ficheiro texto a quando da primeira leitura:
    @Hello World.txt

    0
    1
    2
    3
    4
    @

    O programa devera imprimir 4 na caixa de texto.
    Mas se eu adicionar uma nova linha com o numero 5 no ficheiro texto, o programa deve actualizar automaticamente indicando que a ultima linha passou a ser 5.

    Eu fiz o mesmo programa em C++ mas agora nao estou a conseguir transpor o mesmo para Qt
    @
    while (1)
    {
    if (logfile.is_open())
    {
    logfile.seekg(0, logfile.end);
    string line;

    while (true)
    {
    while (getline(logfile, line))
    {
    strncpy_s(send_data, line.c_str(), sizeof(send_data));
    send_data[sizeof(send_data)-1] = 0;
    ...
    }
    }
    }
    @

    Neste momento em Qt tenho algo assim

    @
    void PC::on_pushButtonStream_clicked()
    {
    QFile file(filename);

    if(!file.open(QIODevice::ReadOnly))
        QMessageBox::information(0,"info",file.errorString());
    
    if(file.isOpen()){
    

    // while(true) //<------CRASH!!!
    // {
    while (!file.atEnd()) {
    QByteArray line = file.readLine();
    ui->textBrowserLog->setText(line);
    }
    // }
    }
    }
    @

    Neste momento para a caixa de texto actualizar tenho de clicar sempre no butao.

    Ja experimentei fazer um
    @while(file.isOpen())@
    mas o programa "crasha".

    Obrigado pela atencao.

    1 Reply Last reply
    0
    • R Offline
      R Offline
      ReinaldoJr
      wrote on last edited by
      #2

      Olá,

      Acredito que você esteja tentando implementar algo parecido com o 'tail -f'.

      Você tem que re-abrir o arquivo a cada atualização de leitura que queira fazer.

      A cada leitura terá que guardar o tamanho do arquivo. Então você vai ler na próxima vez apenas a parte acrescentada no arquivo.

      @while (true)
      {
      QFile file(filename);
      if(!file.open(QIODevice::ReadOnly))
      {
      qint64 fileSize = file.size();
      qDebug() << fileSize;
      file.seek(fileSize - num);
      qDebug() << file.read(num);
      ...
      }
      }@

      1 Reply Last reply
      0
      • L Offline
        L Offline
        leonardo.ramosantos
        wrote on last edited by
        #3

        Olá,

        Seguindo sua linha de raciocínio, você pode ficar verficando o retorno da função "readLine", quando ela retornar um QByteArray com caracteres, é sinal de que foi inserido novo caracter.

        @ void PC::on_pushButtonStream_clicked()
        {
        QFile file(filename);

            if(!file.open(QIODevice::ReadOnly))
                QMessageBox::information(0,"info",file.errorString());
         
            if(file.isOpen()){
                QByteArray line = file.readLine();
                while(line.count() > 0)
                {
                    ui->textBrowserLog->setText(line);
                    QByteArray line = file.readLine();                
                }
            }
        }
        

        @

        No entanto, esta não é a forma correta de se implementar isso. Você pode criar uma classe para manipular somente este arquivo e colocar ela rodar em uma thread separada para que não consuma processamento do Main, e também não deixe a tela travada. Quando o arquivo receber novas linhas você pode notificar a tela por meio de Signals e Slots. Há bastante documentação sobre isso. Caso escolha fazer desta forma, pesquise da seguinte forma:

        • Criar processos paralelos, usar "QThread":http://qt-project.org/doc/qt-5/qthread.html
        • Conectando classes por signals e slots

        Espero ter ajudado.

        1 Reply Last reply
        0
        • D Offline
          D Offline
          digimonkey
          wrote on last edited by
          #4

          Obrigado pela ajuda, neste momento fiz através do QFileSystemWatcher para verificar se ha actualizações no ficheiro de texto, quando ha acciona um trigger para actualizar a caixa de texto.

          Mas entretanto vou experimentar as vossas ideias ideias porque podem facilitar em algum processo futuro.

          1 Reply Last reply
          0

          • Login

          • Login or register to search.
          • First post
            Last post
          0
          • Categories
          • Recent
          • Tags
          • Popular
          • Users
          • Groups
          • Search
          • Get Qt Extensions
          • Unsolved