Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Передача сложного аргумента в QProcess

Автор: RazrFalcon 7.2.2011, 19:01

xwininfo -name "`wmctrl -l | grep SMPlayer | cut -c26-`" | grep "Absolute upper-left Y" | cut -c27-
Это надо выполнить.
Вот фулл:
    QProcess myProcess;
    QString program = "xwininfo";
    QStringList arguments;
    arguments<<"-name"<<"`wmctrl -l | grep SMPlayer | cut -c26-`"<<"| grep 'Absolute upper-left Y' | cut -c27-";
    myProcess.start(program, arguments);
    myProcess.waitForFinished();
    myProcess.close();
    qDebug()<<myProcess.readAll();


У меня ""`wmctrl -l | grep SMPlayer | cut -c26-`"" должно быть как бы в двух кавычках.
Если arguments<<'"-name"'; то даже не компилит.

Автор: Алексей1153 7.2.2011, 19:07

экранировать кавычку ?

\"

? :)

arguments<<"\"-name\"";

Автор: RazrFalcon 7.2.2011, 19:09

arguments<<"-name"<<"\"`wmctrl -l | grep SMPlayer | cut -c26-`\""<<"| grep 'Absolute upper-left Y' | cut -c27-";

так? не пашит все равно...

ИЛИ
QProcess вообще может работать с конвейерами, или надо каждый аргумент отдельно запускать?
Я про wmctrl, grep, cut.

qDebug()<<arguments; выводит:

Цитата
("-name", ""`wmctrl -l | grep SMPlayer | cut -c26-`"", "|", "grep", ""Absolute upper-left Y"", "|", "cut", "-c27-")
Так что все вроде в норме.


Автор: Алексей1153 7.2.2011, 19:26

Цитата(RazrFalcon @ 7.2.2011, 21:09) *
так? не пашет все равно...


во-первых, у тебя зачем и кавычки (") и апострофы (') и ещё некие странные символы (`) . Ну а по существу не могу ничего подсказать, не сталкивался :(

Попробую сейчас в справку глянуть

аа, ты вон про что. У тебя же линукс. Нет, не смогу подсказать точно

Автор: BRE 7.2.2011, 19:34

Все пайпы организует шел, поэтому и запускать его придется.
Сделай скрипт и запускай уже его или руками запускай шел.

sh -c "cmd1 | cmd2 | cmd3"


Автор: RazrFalcon 7.2.2011, 19:39

Про шел уже нашел, спасибо.
А скрипт - это идея. Сейчас попробую.
Так как шел тоже не завелся =/

А само
qDebug()<<myProcess.readAll();
правильно, или его нужно раньше писать?
Может к тому моменту там уже пусто =/

Автор: BRE 7.2.2011, 19:41

Цитата(RazrFalcon @ 7.2.2011, 19:39) *
Может к тому моменту там уже пусто =/

Пусто там может быть только "еще", а "уже" быть не может (если никто другой оттуда ничего не вычитывет). :)

Автор: RazrFalcon 7.2.2011, 19:45

Цитата(read)
#!/bin/bash
xwininfo -id `wmctrl -l | grep SMPlayer | cut -c1-10` | grep 'Absolute upper-left Y' | cut -c27-


так работает
    QProcess myProcess;
    QString program = "/bin/sh";
    QStringList arguments;
    arguments<<"../ambilight/read";
    myProcess.start(program, arguments);
    myProcess.waitForFinished();
    qDebug()<<myProcess.readAll();
    myProcess.close();


qDebug()<<myProcess.readAll(); - только перед myProcess.close(); если после то выводит пустоту. Я об этом спрашивал выше.

Автор: BRE 7.2.2011, 19:48

Цитата(RazrFalcon @ 7.2.2011, 19:45) *
qDebug()<<myProcess.readAll(); - только перед myProcess.close(); если после то выводит пустоту. Я об этом спрашивал выше.

Я на close() и внимания не обратил. :)
Его явно можно и не вызывать, все закроется автоматически после разрушения объекта myProcess.

Автор: RazrFalcon 7.2.2011, 19:50

ААА... ясно. Спасибо. Пашет. :lol:
Еще бы понят почему оно без скрипта не хочет =\

...

arguments<<"-c"<<"xwininfo -id `wmctrl -l | grep SMPlayer | cut -c1-10`  | grep 'Absolute upper-left X' | cut -c27-";
Если все кавычки убрать - пашет!
Только теперь мне надо два процесса запускать, а со скриптом 1-н. Так даже лучше :lol: .

PS как можно прикрутить подсветку синтаксиса у bash в QT Creator?

Автор: BRE 7.2.2011, 19:58

Цитата(RazrFalcon @ 7.2.2011, 19:50) *
Только теперь мне надо два процесса запускать, а со скриптом 1-н. Так даже лучше :lol: .

Эээ. Какие два процесса или один процесс?
Если посмотреть на строку, то запускается куча разных процессов, которые соединяются пайпами.
А шел, и в первом и во втором случае, будет использоваться один. Или ты про что?

Автор: RazrFalcon 7.2.2011, 20:03

А ну да...

мой скрипт:

#!/bin/bash
xwininfo -id `wmctrl -l | grep SMPlayer | cut -c1-10`  | grep 'Absolute upper-left X' | cut -c27-
xwininfo -id `wmctrl -l | grep SMPlayer | cut -c1-10`  | grep 'Absolute upper-left Y' | cut -c27-

А так пришлось бы дважды вызывать QProcess.

Автор: Litkevich Yuriy 7.2.2011, 20:08

Цитата(RazrFalcon @ 7.2.2011, 21:50) *
PS как можно прикрутить подсветку синтаксиса у bash в QT Creator?
это отдельная тема.

вообще можно было извернутся и использовать несколько QProcess, каждый из которых запускает свою программу, ну а тебе надо будет связать их потоки В/В.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)