Russian Qt Forum

Qt => Общие вопросы => Тема начата: ilunga от Май 12, 2009, 21:40



Название: Вопрос по QProcess
Отправлено: 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()?


Название: Re: Вопрос по QProcess
Отправлено: Dodge от Май 12, 2009, 22:20
на сколько я помню, сигнал эмитируется когда на стандартный вывод приходит перевод строки, могу ошибаться, но если это так, то ваша утилита последний перевод строки не шлет, в этом случае, скорее всего нужно просто проверять что накоплено в буфере в ручную, например по таймеру.


Название: Re: Вопрос по QProcess
Отправлено: ilunga от Май 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?


Название: Re: Вопрос по QProcess
Отправлено: Dodge от Май 14, 2009, 00:12
нет, как вы себе это представляете, перенаправить вывод в область памяти? 0_о

Я не представляю что в данном случае возвращает readLine, ибо в QProcess она не переопределена, а чтение происходит с двух пайпов. Рекомендую пользоваться:
readAllStandardError()
readAllStandardOutput()


Название: Re: Вопрос по QProcess
Отправлено: ilunga от Май 15, 2009, 00:01
Спасибо за советы, попробую реализовать.