Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вывод данных из консоли в виджет 
V
    Опции темы
kuvshinka
Дата 18.10.2013, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



выполняю некую команду с помощью метода system - ее результат (некий принт) выводится в консоль сборки (запускаю программу из креатора)...А можно ли этот результат выполнения system-а вывести в какой-нибудь виджет (например listwidget)? как это сделать? 
PM MAIL   Вверх
CompWorm
  Дата 18.10.2013, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



случайно не это?


--------------------
PM MAIL   Вверх
kuvshinka
Дата 18.10.2013, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



через QProcess я пробовала - он вообще отказывается выполнять команду(ды) формата "cd/home/papka1 && ls && ...", через system все проходит, но результат выполнения команд(ы) хотелось бы видеть в программе, а не в консоли... 
PM MAIL   Вверх
o2n3e
Дата 18.10.2013, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.8.2011

Репутация: -1
Всего: -5



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


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


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

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Guinness
Дата 19.10.2013, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



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

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

У QProcess есть соответствующие сигналы, на которые Вы можете подписаться и необходимым для Вас образом обрабатывать. В своё время, у меня никаких проблем не было при обработке стандартного вывода программы, к примеру 7z.
PM MAIL   Вверх
kuvshinka
Дата 20.10.2013, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



Guinness: так и делаю:
Код

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

в итоге команда быстро проходит, но нужного результата не дает (сборка проекта)...с system все нормально выполняется...
PM MAIL   Вверх
Guinness
Дата 21.10.2013, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Вторую часть поста Вы, видимо, не прочитали. Попробуйте вызвать статический метод execute, весь стандартный вывод программы будет в консоли, возможно увидете какую-нибудь ошибку. Также посмотрите, что Вам вернул execute.
PM MAIL   Вверх
kuvshinka
Дата 22.10.2013, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



Код

 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 ?


PM MAIL   Вверх
Guinness
Дата 23.10.2013, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Надо читать документацию - 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 должен гарантированно завершить свое выполнение.
ЗЫ проверьте имена слотов.
ЗЗЫ попробуйте сначала выполнять команды поотдельности, а не фигачить все сразу. Так проще и быстрее искать свои ошибки.
PM MAIL   Вверх
kuvshinka
Дата 23.10.2013, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



команда
Код

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

ничего не выводит в консоль - видимо такую двойную команду execute не понимает, как и start...да, после выполнения start указатель на объект QProcess-a продолжает жить...по-отдельности я не могу (не знаю как) выполнить "cd papka", а затем "qmake" - мне их надо выполнить в одном контексте (а-ля одном сеансе работы терминала) 
PM MAIL   Вверх
Guinness
Дата 24.10.2013, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



А абсолютные пути к *pro файлу указывать нельзя? И почему в этом случае не написать необходимый скрипт( например, на bash или python ) и вызывать уже его?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1240 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.