Как вызвать приложение, ожидающее ввода stdin от QtGui?

Я использую Ubuntu и Qt Creator 4

У меня есть программа .cpp в исполняемой форме (скажем, abc.out), которую я хочу запускать, когда нажимаю кнопку. Он содержит несколько cin и cout, поэтому я хочу, чтобы он запускался на «терминале» (в Ubuntu), чтобы я мог вводить и выводить на него значения. Как я могу это сделать?

Я пробовал system (), а также QProcess p1; p1.start (./ abc.out);

Используя QProcess, мой исполняемый файл запускается, но останавливается на первом cout. Он запускается на экране вывода приложения в Qt Creator, а не на терминале.

Например: в выводе приложения я вижу:

введите имя:

Когда я набираю значение и нажимаю здесь ввод, он не принимает значение, но переходит к следующей строке и позволяет мне вводить дальше. Я хочу запустить этот abc.out файл на терминале. Любые идеи были бы действительно полезны.


person user1484717    schedule 27.06.2012    source источник
comment
Я не уверен, понял ли я ваш вопрос ... вы пытаетесь написать приложение, которое запускает другие приложения с помощью QProcess? В этом случае вы должны явно указать, как пользовательский ввод отправляется вашим дочерним приложениям.   -  person pwuertz    schedule 27.06.2012


Ответы (3)


Вы имеете в виду Qt Creator 2.4? В любом случае на вкладке «Проекты» вы должны найти раздел «Параметры запуска», а оттуда вы можете найти флажок «Запускать в терминале». Вы также можете использовать опцию Custom Executable и ввести там: gnome-terminal --command ./abc.out Точные детали могут немного отличаться, поскольку я использую Qt Creator 2.5.

Это должно работать при запуске из Qt Creator, но когда вы используете свое приложение вне IDE, вам нужно запускать его из терминала, а не двойным щелчком по исполняемому файлу. Чтобы исправить это, я могу придумать два способа:

  1. Запустите окно терминала из QtGui (что-то вроде QProcess::execute("gnome-terminal --command ./abc.out");), хотя проблема в том, что разные системы имеют разные имена терминалов.
  2. Создайте собственное поле ввода / ввода Qt как часть вашего графического интерфейса, которое затем перенаправляет вводимые пользователем данные в исполняемый файл (что-то вроде myqprocess.write(input_asked_from_user_by_QtGui);). Здесь вам, вероятно, нужно знать, какую информацию запрашивать у пользователя заранее. Если вы хотите отобразить вывод cout запущенного процесса, вы можете использовать read метод и друзей QProcess.
person Tapio    schedule 27.06.2012
comment
Не думаю, что я был ясен. void MainWindow :: on_pushButton_clicked () {QProcess p1; p1.execute (./ obj.out); } Это мой код. obj.out имеет ряд cin и cout. Как мне с этим справиться? Первый cout появляется в окне вывода приложения создателя. Я думаю, что если бы я мог получить std :: cin и std :: cout из obj.out, чтобы они отображались на терминале, как в gcc, эта проблема исчезла бы - person user1484717; 27.06.2012
comment
@ user1484717 - Это то, что я пытался решить в своем ответе. Я внес в него некоторые подсказки по реализации. - person Tapio; 27.06.2012
comment
Спасибо. Я запустил окно терминала и смог справиться с этим - person user1484717; 29.06.2012

Из вашего вопроса я предполагаю, что вы пишете приложение, которое запускает другие приложения с помощью QProcess. Это нормально, но если ваш подпроцесс ожидает данных со стандартного ввода, он будет ждать вечно, поскольку вы не предоставили никаких данных. Стандартный ввод вашего родительского приложения не может быть автоматически направлен в подпроцесс. Представьте, что вы запускаете два процесса из своего основного приложения. В какой дочерний процесс должен идти ввод?

Если вы хотите взаимодействовать с дочерними процессами, вы должны использовать методы QIODevice QProcess и отправлять / читать данные из / в это приложение.

person pwuertz    schedule 27.06.2012

Единственное разумное решение - запустить целевое приложение в терминале. Независимо от того, предоставляет ли ваш собственный код окно терминала или вы повторно используете существующее приложение терминала, зависит от вас.

person Kuba hasn't forgotten Monica    schedule 27.06.2012