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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по QProcess  (Прочитано 4097 раз)
ilunga
Гость
« : Май 12, 2009, 21:40 »

Поможите, пожалуйста.

Приложение должно запускать утилиту CABARC, которая распаковывает файлы в указанную директорию, нужно чтобы вывод утилиты отображался в QLabel.

Проблема в том, что cabarc выводит в консоль несколько строк, но сигнал readyReadStandardOutput() испускается только один раз.

Вот код:
Код:
    arguments<<"-p"<<"x"<<"djvu.cab"<<path;
    cabarc = new QProcess(this);
    cabarc->setProcessChannelMode(QProcess::MergedChannels);
    connect(cabarc, SIGNAL(finished(int)), this, SLOT(step3_load()));
    connect(cabarc, SIGNAL(readyReadStandardOutput()), this, SLOT(on_dir_changed()));
    cabarc->start("CABARC.EXE",arguments);
   
   

как сделать, чтобы после каждой выведеной строчки посылался сигнал readyReadStandardOutput()?
« Последнее редактирование: Май 12, 2009, 23:59 от ilunga » Записан
Dodge
Гость
« Ответ #1 : Май 12, 2009, 22:20 »

на сколько я помню, сигнал эмитируется когда на стандартный вывод приходит перевод строки, могу ошибаться, но если это так, то ваша утилита последний перевод строки не шлет, в этом случае, скорее всего нужно просто проверять что накоплено в буфере в ручную, например по таймеру.
Записан
ilunga
Гость
« Ответ #2 : Май 13, 2009, 21:42 »

Воспользовался таймером:
Код:
...
  cabarc = new QProcess(this);
  timer = new QTimer;


  connect(cabarc, SIGNAL(finished(int)), this, SLOT(step3_load()));
  connect(cabarc, SIGNAL(finished(int)), timer, SLOT(stop()));
  connect(timer, SIGNAL(timeout()), this, SLOT(on_dir_changed()));

  cabarc->start("CABARC.EXE",arguments);
  timer->start(50);

}



void MainWindow::on_dir_changed() //
{

    path=cabarc->readLine(1000);
    label->setText(path);

}

Вывод отображается в QLabel, но спустя некоторое время после старта cabarc, и выводится не все. Создается впечатление, что главное приложение как бы подвисает , хотя GUI не замораживается Непонимающий
можно как-нибудь перенаправить вывод прямо в QLabel?
Записан
Dodge
Гость
« Ответ #3 : Май 14, 2009, 00:12 »

нет, как вы себе это представляете, перенаправить вывод в область памяти? 0_о

Я не представляю что в данном случае возвращает readLine, ибо в QProcess она не переопределена, а чтение происходит с двух пайпов. Рекомендую пользоваться:
readAllStandardError()
readAllStandardOutput()
Записан
ilunga
Гость
« Ответ #4 : Май 15, 2009, 00:01 »

Спасибо за советы, попробую реализовать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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