Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > вывод данных из консоли в виджет


Автор: kuvshinka 18.10.2013, 18:54
выполняю некую команду с помощью метода system - ее результат (некий принт) выводится в консоль сборки (запускаю программу из креатора)...А можно ли этот результат выполнения system-а вывести в какой-нибудь виджет (например listwidget)? как это сделать? 

Автор: CompWorm 18.10.2013, 19:16
случайно не http://qt.apidoc.info/5.1.1/qtcore/qprocess.html#readAllStandardOutput?

Автор: kuvshinka 18.10.2013, 19:20
через QProcess я пробовала - он вообще отказывается выполнять команду(ды) формата "cd/home/papka1 && ls && ...", через system все проходит, но результат выполнения команд(ы) хотелось бы видеть в программе, а не в консоли... 

Автор: o2n3e 18.10.2013, 20:19
Суть в том, что system() - это запуск иного кроцесса(sh, cmd), которым ты норм рулить не можешь и его stdout нормально перехватить не можешь(не через жопу). Запускает программы баш так-то так, как я описал ниже.


Это коталоги/директориии, а не "папки".


Берёшь qprocess() и запускаешь в нём баш(sh) exec()'ом с вариациями, переводишь stdout в другой поток и читаешь - купроцесс вон может это делать за тебя. Возможно там есть write_stdin() - поищи, сюда пишешь комманды. Баш работает так же.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/вывод-данных-из-консоли-в-виджет-id52615a4eae2015c511000000#findElement_E7045_52616dafae2015051a0001a5_0

Автор: Guinness 19.10.2013, 11:05
Цитата(kuvshinka @  18.10.2013,  20:20 Найти цитируемый пост)
QProcess я пробовала - он вообще отказывается выполнять команду(ды) формата "cd/home/papka1 && ls && ..."

Приведите пример как Вы это делаете.
Цитата(kuvshinka @  18.10.2013,  20:20 Найти цитируемый пост)
хотелось бы видеть в программе, а не в консоли...

У http://qt-project.org/doc/qt-5.1/qtcore/qprocess.html есть соответствующие сигналы, на которые Вы можете подписаться и необходимым для Вас образом обрабатывать. В своё время, у меня никаких проблем не было при обработке стандартного вывода программы, к примеру 7z.

Автор: kuvshinka 20.10.2013, 19:47
Guinness: так и делаю:
Код

QProcess *process = new QProcess();
process->start("cd/home/papka1 && qmake project.pro && make"); 

в итоге команда быстро проходит, но нужного результата не дает (сборка проекта)...с system все нормально выполняется...

Автор: Guinness 21.10.2013, 09:05
Вторую часть поста Вы, видимо, не прочитали. Попробуйте вызвать статический метод execute, весь стандартный вывод программы будет в консоли, возможно увидете какую-нибудь ошибку. Также посмотрите, что Вам вернул execute.

Автор: kuvshinka 22.10.2013, 16:01
Код

 QProcess *process;
  process = new QProcess();
///////////////////////////////////////////////////////////////////////////////////////////
  connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(slotReadStandardOutput()));
  connect(process, SIGNAL(finished(int)), this, SLOT(slotProcessFinished(int)));
///////////////////////////////////////////////////////////////////////////////////////////

void MainWindow::sltoReadStandardOutput()
{
  QString cmdLineText = process->readAllStandardOutput().data();
  listWidget->addItem(trUtf8(cmdLineText.toAscii()));
}
///////////////////////////////////////////////////////////////////////////////////////////

void MainWindow::slotProcessFinished(int status)
{
    qDebug() << " qprocess finished:  " << status; 
}
///////////////////////////////////////////////////////////////////////////////////////////

void MainWindow::on_pushButton_clicked()
{
  int code = 0;
  code = process->execute("cd papka1 && ls");
  qDebug() << "code is " << code;
}

в итоге code = 0; не вызываются слоты  slotProcessFinished,  sltoReadStandardOutput...
из консоли запущенная команда(ды) cd papka1 && ls срабатывает верно... без  cd papka1 (только ls) execute выводит свой результат (т. е. список файлов в текущем каталоге) в консоль приложения, а не в  listWidget (не вызываются слоты  slotProcessFinished,  sltoReadStandardOutput).  Вызываются слоты  slotProcessFinished,  sltoReadStandardOutput
только при вызове команды start qprocess-a и выполнении ею только команды ls. Так как же мне с помощью qprocess-a выполнить команду(ды) типа cd papka1 && ls ?


Автор: Guinness 23.10.2013, 07:35
Надо читать документацию - execute - статический метод:
Цитата

Starts the program program with the arguments arguments in a new process, waits for it to finish, and then returns the exit code of the process. Any data the new process writes to the console is forwarded to the calling process.

The environment and working directory are inherited from the calling process.

On Windows, arguments that contain spaces are wrapped in quotes.

If the process cannot be started, -2 is returned. If the process crashes, -1 is returned. Otherwise, the process' exit code is returned.

Т.е. при его вызове никаких сигналов выбрасываться не будеть. Ваша программа будет дожидаться окончания выполнения execute, а весь вывод программы должен появиться в консоли. Кстати, что там вывелось?
Если Вы хотите получать сигналы, вызывайте start. Я Вам предложил использовать execute только в целях отладки. А также, потому что я не понял, продолжает ли жить у Вас объект QProcess после вызова start или нет. А так execute должен гарантированно завершить свое выполнение.
ЗЫ проверьте имена слотов.
ЗЗЫ попробуйте сначала выполнять команды поотдельности, а не фигачить все сразу. Так проще и быстрее искать свои ошибки.

Автор: kuvshinka 23.10.2013, 15:40
команда
Код

process->execute("cd papka1 && qmake project.pro");

ничего не выводит в консоль - видимо такую двойную команду execute не понимает, как и start...да, после выполнения start указатель на объект QProcess-a продолжает жить...по-отдельности я не могу (не знаю как) выполнить "cd papka", а затем "qmake" - мне их надо выполнить в одном контексте (а-ля одном сеансе работы терминала) 

Автор: Guinness 24.10.2013, 07:07
А абсолютные пути к *pro файлу указывать нельзя? И почему в этом случае не написать необходимый скрипт( например, на bash или python ) и вызывать уже его?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)