Как да извикате приложение, което очаква stdin въвеждане от QtGui?

Използвам Ubuntu и Qt Creator 4

Имам .cpp програма в изпълнима форма (да речем abc.out), която искам да стартирам, когато натисна бутон. Той съдържа редица cin и cout, така че искам да работи на "терминал" (на Ubuntu), така че да мога да въвеждам и извеждам стойности към него. Как мога да направя това?

Опитах system(), а също и QProcess p1; p1.start(./abc.out);

Използвайки QProcess, моят изпълним файл се изпълнява, но спира при първия изход. Работи на изходния екран на приложението в Qt Creator, а не на терминала.

Например: виждам в изхода на приложението:

въведете име:

Когато напиша стойността и натисна enter тук, тя не приема стойността, но се премества на следващия ред и ми позволява да въвеждам по-нататък. Искам да стартирам този abc.out файл на терминала. Всякакви идеи биха били наистина полезни.


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


Отговори (3)


Имате предвид Qt Creator 2.4? Във всеки случай в раздела Проекти трябва да намерите секцията Настройки за изпълнение и от там можете да намерите квадратчето за отметка „Изпълни в терминала“. Можете също да използвате опция за персонализиран изпълним файл и да въведете там: gnome-terminal --command ./abc.out Точните подробности могат да варират малко, тъй като използвам Qt Creator 2.5.

Това трябва да работи при стартиране от Qt Creator, но когато използвате приложението си извън IDE, трябва да го стартирате от терминала, а не чрез двукратно щракване върху изпълнимия файл. За да поправя това, мога да измисля два начина:

  1. Стартирайте терминален прозорец от QtGui (нещо като QProcess::execute("gnome-terminal --command ./abc.out");), въпреки че проблемът е, че различните системи имат различни имена на терминали.
  2. Осигурете сами поле за въвеждане/текст на Qt като част от вашия GUI, което след това препраща въведеното от потребителя към изпълнимия файл (нещо като 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 се появява в изходния прозорец на приложението на creator. Мисля, че ако мога да накарам 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. Това е добре, но ако вашият подпроцес чака данни от стандартния вход, той ще чака завинаги, тъй като не сте предоставили никакви данни. stdin на вашето родителско приложение не може да бъде насочван автоматично към подпроцеса. Представете си, че стартирате два процеса от основното си приложение. Към кой дъщерен процес трябва да отиде входът?

Ако искате да комуникирате с дъщерни процеси, трябва да използвате методите QIODevice на QProcess и да изпращате/четете данни от/към това приложение.

person pwuertz    schedule 27.06.2012

Единственото разумно решение е да стартирате целевото приложение в терминал. Дали вашият собствен код предоставя терминалния прозорец или ще използвате повторно съществуващо терминално приложение зависи от вас.

person Kuba hasn't forgotten Monica    schedule 27.06.2012