2016-12-14 10 views
1

Qt новичок здесь :). В настоящее время я выполняю сценарий bash в Qt, используя функцию popen, чтобы перенаправить вывод в текстовый блок в моем приложении. Когда я добавляю сценарий к моему проекту в качестве ресурса, он больше не работает? Я использую синтаксис :/myScript.sh, а затем попытаюсь добавить мои аргументы в QStrings. Любые советы будут оценены!Запуск сценария Bash с аргументами в качестве ресурса Qt

FILE *in; 
char buff[512]; 
QString args = ":/myScript.sh" + <arguments>; 
QByteArray ba = args.toLatin1(); 
char *temp = ba.data(); 
if(!(in = popen(temp , "r"))) 
{ 
    exit(1); 
} 
while(fgets(buff, sizeof(buff), in)!=NULL) 
{ 
    ui->txtConsole->append(buff); 
} 
ui->progressBar->setValue(50); pclose(in); 
+0

Я не думаю, что это сработает, но я не могу быть уверен, не видя ваш код. Можете ли вы поделиться кодом, который вы используете, для создания всплывающего вызова, материала ':/myScript.sh' и аргументов QString? – selbie

+0

'FILE * in; char buff [512]; QString args = ": /myScript.sh" + ; QByteArray ba = args.toLatin1(); char * temp = ba.data(); if (! (In = popen (temp, "r"))) { выход (1); } while (fgets (buff, sizeof (buff), in)! = NULL) { ui-> txtConsole-> append (buff); } – Sphics

+2

Поскольку вы, по-видимому, в программе графического интерфейса, вам может потребоваться использовать 'QProcess' вместо' popen() 'для асинхронного запуска программы. –

ответ

3

Вызов popen с форматом пути ресурсов Qt не будет делать то, что вы ожидаете.

Вы фактически пытаетесь вызвать это:

popen(":/myScript.sh args", "r"); 

popen функция ничего не знает о системе ресурсов Qt, ни синтаксиса :/ не знаю. Он ожидает первого параметра пути на диске, который понимает операционная система.

Два варианта:

  1. Просто корабля файл myScript.sh в отдельный файл и выполнить его непосредственно. (То, что вы наблюдали, работало, прежде чем пытаться сделать скрипт ресурсом). Если вы не используете , скомпилированные ресурсы, скорее всего, это файл на диске. Просто вызовите popen по абсолютному пути к файлу вместо синтаксиса :/.

  2. Напишите код, чтобы извлечь текстовый файл myScript.sh из ресурсов и сохранить его локально на диск. Затем вызовите popen в этом сохраненном файле.

+0

Спасибо. Он работает, когда myScript.sh является отдельным файлом. Я просто подумал, что было бы неплохо включить его в качестве ресурса, поэтому его не нужно копировать за каждый раз :) – Sphics

+0

Вы можете использовать 'QFile :: copy()' для копирования из файла ресурсов в фактический файл, или используйте 'QTemporaryFile :: createNativeFile()' –