#c #qt #ubuntu #qt4
#c #qt #ubuntu #qt4
Вопрос:
Я использую Ubuntu 10.10 с QT4.
мне интересно, возможно ли, чтобы QListWidget отображал вывод, например:
system("dhclient eth0");
затем создание QListWidget показывает DHCPREQUEST / SHCPACK и т.д. В режиме реального времени?
До сих пор я мог только передавать вывод команды в файл, затем заставить мою программу прочитать файл, который, очевидно, не показывает пакеты DHCP, которыми обмениваются в данный момент.
Ответ №1:
Хорошо, я решил это, вот короткие примеры того, как я это делаю, я бы только показал свою реализацию
test::test()
{
widget.setupUi(this);
call();
QObject::connect(amp;proc,SIGNAL(readyReadStandardOutput()),this,SLOT(stdOut()) );
QObject::connect(amp;proc,SIGNAL(readyReadStandardError()),this,SLOT(stdErr()) ) ;
QObject::connect(amp;proc,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(bye(int,QProcess::ExitStatus)) );
}
void test::call()
{
proc.start("dhclient eth0");
}
void test::stdErr()
{
QByteArray data = proc.readAllStandardError();
widget.listWidget->addItem(QString(data));
}
void test::stdOut()
{
QByteArray data = proc.readAllStandardOutput();
widget.listWidget->addItem(QString(data));
}
void test::bye(int code,QProcess::ExitStatus exit)
{
if(code ==0)
{
widget.listWidget->addItem("Done");
}
}
Ответ №2:
Возможно, этот пример кода поможет вам:
QProcess gzip;
gzip.start("gzip", QStringList() << "-c");
if (!gzip.waitForStarted())
return false;
gzip.write("Qt rocks!");
gzip.closeWriteChannel();
if (!gzip.waitForFinished())
return false;
QByteArray result = gzip.readAll();
Комментарии:
1. Однако это не будет работать в режиме «реального времени», для этого вам нужно подключиться к сигналу readyReadStandardOutput() и прочитать данные по частям. И не использовать waitForFinished(), а подключаться к сигналам error() и finished().
2. @Frank Osterfeld итак, я должен использовать readyReadStandardOutput() в качестве сигнала и слота для вывода в мой виджет?