Tail-f function in qt
-
QTextStream does not have a readyRead signal, QFile does (from QIODevice).
-
"qfile wont emit signals like qio":http://qt-project.org/doc/qt-4.8/qfile.html#signals
-
Right ! I forgot about that.
Did you have a look at QSocketNotifier ? It might be what you need to monitor a pipe on unix. -
thanks Sgaist
@ notifier = new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read);
connect(notifier, SIGNAL(activated(int)), this, SLOT(readcsv()));@and used repaint() function in readcsv function...now gui is showing the contents ..but gui is still freezed...
any possible solution -
Do you still have an infinite loop somewhere ?
-
hi sgaist...This is the code...only using while(!line.isEmpty());
have tried with isnull() also..but same
@void MainWindow::readcsv()
{
QString line;
//ui->alertshow->repaint();
qDebug()<<"in readcsv";
QTextStream in(stdin,QIODevice::ReadOnly);do { // ui->alertshow->repaint(); qDebug()<<"inside while"; line = in.readLine(); qDebug()<<line; QString delimiterPattern(","); QStringList fonts = line.split(delimiterPattern); qDebug() <<"fonts"<< fonts; display(fonts); }while(!line.isEmpty()); qDebug()<<"outside";
}
void MainWindow::display(QStringList list)
{
ui->alertshow->repaint();
for(int i=0;i<list.count();i++)
{QString li=list[i];
qDebug()<<"csv"<<li;
item=new QTableWidgetItem(li);
ui->alertshow->setItem(row,column,item);
column++;
}
// ui->alertshow->repaint();
}
@ -
Wild idea (i don't have *nix system right now at hand)
Why don't you do a readAll() and then parse the lines from that ?
-
Not sure if you would be interested, but I have abit of code that starts a tail -f as a QProcess and just redirects the output of that process to a QLineEdit
It's not hard to do, let me know and ill lookup the snippet when I get back at work on Monday.
Cheers
-
Thanks clogwog...It would be very helpful if u provide the snippet.
[quote author="clogwog" date="1362136280"]Not sure if you would be interested, but I have abit of code that starts a tail -f as a QProcess and just redirects the output of that process to a QLineEditIt's not hard to do, let me know and ill lookup the snippet when I get back at work on Monday.
Cheers[/quote]
-
header:
@myclass
{
startFollowingTail();private:
QProcess procTail;
private slot:
void readFromStdoutForTail();
}@in constructor:
@myclass::myclass() : ..... , procTail(this)
{
connect( &procTail, SIGNAL(readyReadStandardOutput()),this, SLOT(readFromStdoutForTail()) );
}myclass::startFollowingTail()
{
if( procTail.Running)
procTail.kill();QStringList alist; alist << "-f" << "/tmp/software_update.log"; procTail.start("/usr/bin/tail", alist, QIODevice::ReadWrite);
}
void myclass::readFromStdoutForTail()
{
while ( procTail.canReadLine())
{
QByteArray a = procTail.readLine();
QString data = a.data();
ui->plainTextEdit->insertPlainText(data);
// scroll to end
ui->plainTextEdit->verticalScrollBar()->setValue(ui->plainTextEdit->verticalScrollBar()->maximum());
}
}@ -
I've only tested this on Linux (Fedora Core 16) and Qt 4.8.4, but this worked like "tail -f" for me:
@volatile bool shutdown = false;
QTextStream textStream;void tailFollow()
{
while (!shutdown)
{
if (textStream.atEnd())
QThread::sleep (1);
else
{
QString line = textStream.readLine();
// Do something with line here...
}
}
}@In the actual code, "shutdown" and "textStream" were member variables of a QThread subclass, and tailFollow() was a method on that QThread subclass. The client would set "shutdown" to true when the loop should exit.