2013-02-19 3 views
3

Я хочу запустить двоичный файл C++, который я создал из приложения Qt. Как это возможно ? В Java у меня было что-то вроде Runtime.exec(). Не могли бы вы рассказать мне, как это возможно в рамках Qt?Запуск C++ двоичного кода изнутри Qt и перенаправление вывода двоичного кода в текстовое поле приложения Qt

Кроме того, хотя мой бинарный файл работает, я хочу, чтобы выход этой программы (которая теперь записывается в консоль) записывается в текстовое поле в Qt. Я могу легко сделать textbox.setText(), если бы у меня были данные, написанные на консоли в строке. Таким образом, в основном вопрос заключается в том, как получить доступ к данным, которые программа должна писать на консоль, в то время как она фактически запускается изнутри Qt-инфраструктуры.

Я знаю, что я могу решить обе эти проблемы, просто выполнив и скомпилировав свой код изнутри Qt, но я спрашиваю, потому что я нахожусь в середине разрыва времени и некоторых проблем с дизайном. Если эта причина не всплывают лодку, любезно думать о вопросе, как домашнее задание вопрос и помочь мне :)

ответ

6

QProcess является вашим другом ,

что-то близко к минимальной версии некоторого кода, который вызывает интерпретатор команд Windows, и ждет синхронно для его вывода, чтобы получить простой список каталогов будет выглядеть следующим образом:

QProcess process; 
process.start("cmd.exe", 
       QStringList() << "/c" << "dir" << "/b", 
       QIODevice::ReadWrite | QIODevice::Text); 
if(!process.waitForFinished()) // beware the timeout default parameter 
    qDebug() << "executing program failed with exit code" << process.exitCode(); 
else 
    qDebug() << QString(process.readAllStandardOutput()).split('\n'); 

Интереснее если вы хотите запустить его асинхронно и получить «онлайн» результаты, возможно, в приложении Qt-GUI, чтобы обновить индикатор выполнения. У вас будет часть настройки, например. внутри основной конструктор формы вдоль линий:

process = new QProcess(this); 
connect(process, SIGNAL(readyReadStandardOutput()), SLOT(onStdoutAvailable())); 
connect(process, SIGNAL(finished(int,QProcess::ExitStatus)), SLOT(onFinished(int,QProcess::ExitStatus))); 

Может быть, в кнопку нажал обработчик вызова что-то вроде:

process->start("some_command", QStringList() << "some" << "args", 
       QIODevice::ReadWrite | QIODevice::Text); 
if(!process->waitForStarted()) 
    // some_command failed to even start 

Затем вызовите процессно> readAllStandardOutput() внутри вашей onStdoutAvailable() и проанализируйте его как-то, чтобы определить ваш прогресс. И, наконец, оцените exitCode и exitStatus параметры подключенного finished() сигнал, чтобы определить, все ли в порядке (TM) '.

Это начинает получать удовольствие, если вы хотите, чтобы вы могли остановить/убить процесс и все потенциальные процессы ребенка без их согласия и сделать эту кросс-платформу ... но это, очевидно, выходит за рамки вашего вопроса.

+0

спасибо. Поскольку я нахожусь в Linux, мне придется попробовать '/ bin/bash' вместо' cmd.exe'. Я попробую это! Благодарю. – Chani

+1

Ahh, Linux ... (как я могу сделать ошибку и создать впечатление, что я буду участником Windows в моем _very first_ ответе здесь?;)). Обратите внимание, что 'dir' - это не программа для Windows, а команда оболочки, поэтому мне пришлось выполнить' cmd.exe' и попросить ее выполнить 'dir'. В Linux вы можете напрямую выполнить программу 'ls', например' process.start ("/ bin/ls") '. Также обратите внимание, что для Linux-кода вам не нужен флаг QIODevice :: Text OpenMode для правильных окончаний строк «\ n». – axxel

3

Посмотрите на QProcess и его методы, особенно при readAllStandardOutput()

+0

спасибо за указатель – Chani

Смежные вопросы