[Duvida] QFile read constante
-
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.txt0
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.
-
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);
...
}
}@ -
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.
-
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.