Russian Qt Forum
Ноябрь 23, 2024, 16:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: StdOut  (Прочитано 8044 раз)
diva
Гость
« : Август 08, 2005, 13:39 »

Я с помощью QProcess выполняю консольные программы Мне нужно прочитать что она возвращает Пробывал [virtual QString readLineStdout ()] у меня ничего не получается Подскажите
Записан
Hellenna
Гость
« Ответ #1 : Август 08, 2005, 14:54 »

Код:
QStringList out;
QStringList err;

QProcess *proc=new QProcess(parent, name);
connect(proc, SIGNAL(readyReadStdout()), this, SLOT(readStdout()));
connect(proc, SIGNAL(readyReadStderr()), this, SLOT(readStderr()));

void Widget::readStderr(){
QString tmp=proc->readLineStderr();
while (tmp.isNull()==false){
err.append(tmp);
tmp=proc->readLineStderr();
}
}

void Widget::readStdout(){
QString tmp=proc->readLineStdout();
while (tmp.isNull()==false){
out.append(tmp);
tmp=proc->readLineStdout();
}
}


всегда работает
Записан
diva
Гость
« Ответ #2 : Август 09, 2005, 09:38 »

Что-то мне возвращаются пустые строки и срабатывает readStderr()
В общем я посылаю команду поиска файлов и хочу чтобы их видедь в листбоксе.
Может я что-то не понимаю или не так делаю
Записан
Hellenna
Гость
« Ответ #3 : Август 09, 2005, 09:44 »

комманда поиска файлов это find?
ты ей ключик --print указал?
Пробовал просто ту комманду которую скармливаешь QProcess в консоли запустить, там все в порядке, пишется точно на stdout?
Еще как вариант, у меня такое пару раз было: комманду со всеми ключами и аргументами надо записать в файл и запустить этот файл на выполнение.
Можешь точно написть чего скармливаешь QProcess, может дело в аргументах...
Записан
diva
Гость
« Ответ #4 : Август 11, 2005, 10:13 »

команда find в консоли работает нормально и выводит на экран все что нашла.
Вот код что я делал
Код:

# include <qprocess.h>
QProcess *proc;
QStringList out;
QStringList err;

void Form1::search()
{
proc = new QProcess(this);
proc->addArgument("find");
proc->addArgument(".*txt");
proc->start();
connect(proc, SIGNAL(readyReadStdout()), this, SLOT(readStdout()));
connect(proc, SIGNAL(readyReadStderr()), this, SLOT(readStderr()));

}

void Form1::readStderr(){
   QString tmp=proc->readLineStderr();
   while (tmp.isNull()==false){
      err.append(tmp);
      tmp=proc->readLineStderr();
    }
     listBox1->insertItem("Error");
}

void Form1::readStdout(){
   QString tmp=proc->readLineStdout();
   while (tmp.isNull()==false){
      out.append(tmp);
      tmp=proc->readLineStdout();
     
   }
     listBox1->insertItem("Ok");
}


Может ошибка именно здесь но почемуто вызывается readStderr()
Записан
Dair
Гость
« Ответ #5 : Август 11, 2005, 12:30 »

Код:
proc->addArgument(".*txt"); 


Это опечатка здесь или в коде программы? ;-)
Мне так кажется, что должно быть "*.txt"

это раз.

2. попробуй connect() делать до start() - в mutithread может быть актуально.
(да и вообще - я для себя завел хорошую традицию все connect'ы делать сразу после создания объекта :-))

3. ReadyReadStderr() в любом случае будет послан по, например, выходу из программы. Тогда readLineStderr вернет пустую строку (проверяй не isNull, а isEmpty - тогда должно сработать)

... а если в readStdout сразу после "while... {" поставить qDebug( tmp )?..

4. Это *nix? Попробуй не просто find, а /usr/bin/find (или смотри, где расположен у тебя find - which find)
Записан
diva
Гость
« Ответ #6 : Август 12, 2005, 09:36 »

Получилось.
Если кому интересно то смотрите
Код:

 include <qprocess.h>
QProcess *proc;
QStringList out;
QStringList err;

void Form1::search()
{
proc = new QProcess(this);
proc->addArgument("find");
proc->addArgument("-iname");
proc->addArgument("*.txt");
//proc->addArgument(">");
//proc->addArgument("asd");
connect(proc, SIGNAL(readyReadStdout()), this, SLOT(readStdout()));
connect(proc, SIGNAL(readyReadStderr()), this, SLOT(readStderr()));
proc->start();
}

void Form1::readStderr(){
   QByteArray data =proc->readStderr();
   QString text = textEdit1->text() + QString(data);
   textEdit1->setText(text);
}

void Form1::readStdout(){
   QByteArray data =proc->readStdout();
   QString text = textEdit1->text() + QString(data);
   textEdit1->setText(text);


И оно ищет все что мне надо. Трабла была в том, что я задавал команду поиска так: find *.txt в QT и оно говорило что ненайден файл или директория (хотя в консоли работает отлично и не вызывает никакой ошибки. Почему не знаю).
Записан
Dair
Гость
« Ответ #7 : Август 12, 2005, 09:40 »

Потому что в консоли *.txt раскрывает шелл, а в Qt шелл встроить до сих пор не догадались :-)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.057 секунд. Запросов: 21.