PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash pipe in QT/KDE nachbilden



celindir
11-03-2003, 09:29
Hallo zusammen,

ich habe ein Script für die Bash geschrieben, das unter anderem folgende Pipe enthält:


jpegtopnm bild.jpg | pnmscale -xysize 768 576 | pnmpad -black -width=768 -height=576 | pnmscale -xscale 0.916667 | ppmntsc --pal | ppmtoyuv4mpeg2 | mpeg2enc -v 0 -f 6 -F 3 -a 2 -n p -T 120 | mplex -v 0 -f 6 -o bild.jpg.mpg


Jetzt will ich das Ganze in einem QT/KDE-Programm benutzen und frage mich, ob ob es eine Möglichkeit gibt, diese Pipe auch in QT/KDE darzustellen.

Mit Qprocess wird wohl nur das erste Argument als Programmaufruf interpretiert und die anderen nur als Parameter, oder ??

Im Zweifelsfall kann ich ja immer noch das Script über Qprocess aufrufen, aber es müsste doch auch eine elegantere Möglichkeit geben.

Vielen Dank fürs Kopfzerbrechen

tuxipuxi
11-03-2003, 09:39
also wenn du das willst kannst du deine oben genannte linie von einem QProcess ausfuehren lassen.
probier mal alles, also mit den ganzen pipes als EIN argument zu machen.
processobject->addArgument( "jpegtopnm bild.jpg | pnmscale -xysize 768 576 | pnmpad -black -width=768 -height=576 | pnmscale -xscale 0.916667 | ppmntsc --pal | ppmtoyuv4mpeg2 | mpeg2enc -v 0 -f 6 -F 3 -a 2 -n p -T 120 | mplex -v 0 -f 6 -o bild.jpg.mpg " );
oder gleich im konstruktor des QProcesses.

anda_skoa
11-03-2003, 14:32
Du kannst natürlich das Shell script als externen Prozess verwenden.

Es läßt sich womöglich auch ohne Script machen, wenn du KProcess::setUseShell benutzt.
Damit musst du ein bsichen experimentieren, das hab ich selber noch nicht benutzt.

Ciao,
_

celindir
12-03-2003, 08:47
Original geschrieben von tuxipuxi
also wenn du das willst kannst du deine oben genannte linie von einem QProcess ausfuehren lassen.
probier mal alles, also mit den ganzen pipes als EIN argument zu machen.
processobject->addArgument( "jpegtopnm bild.jpg | pnmscale -xysize 768 576 | pnmpad -black -width=768 -height=576 | pnmscale -xscale 0.916667 | ppmntsc --pal | ppmtoyuv4mpeg2 | mpeg2enc -v 0 -f 6 -F 3 -a 2 -n p -T 120 | mplex -v 0 -f 6 -o bild.jpg.mpg " );
oder gleich im konstruktor des QProcesses.

Hi Tuxipuxi,

der erste Versuch hat leider noch nicht geklappt (mit addArgument)
er läuft immer wieder in
if (!qprocessobject->start())
hinein, kann also den process nicht starten.

Hab jetzt erstmal das Script als QProcessaufruf genommen, das klappt fürs erste aber ich werd an dem anderen auch noch mal weitertesten.

Vielen Dank für die Anregung.

tuxipuxi
12-03-2003, 09:07
das kann eigentlich nicht angehen. soweit ich weiss erzeugt QProcess doch sowieso nur n Prozess mit exec() oder aehnlichem... das muss doch gehen.

nur zur ueberpruefung: process->start() hast du schon aufgerufen oder?

zeig doch mal code wie du das probiert hast mit meinem vorschlag... das muss einfach gehen.

gruss tuxipuxi

celindir
12-03-2003, 09:29
Hallo Tuxipuxi,

hier mein Code (leider aus dem Gedächtnis, weil ich gerade nich an meinem Linuxrechner sitze)


void frmHauptFenster::Convert()
//initializing Process
my_proc = new QProcess();

zahl = 0;
bild = lb_seg_items->text (zahl); //lb_seg_items ist eine QListBox mit Bildern als Einträge

while ( !bild.isEmpty())
{
my_proc->clearArguments();
// connect Stout; Stderr and End to Log
connect ( my_proc , SIGNAL (readyReadStdout () ), this, SLOT ( readFromSTdout() ) );
connect( my_proc , SIGNAL ( readyReadStderr() ), this, SLOT ( readFromStderr()) );
connect( my_proc , SIGNAL ( processExited() ), this, SLOT( ProzessEnde()) );

//nächste Zeile ist im Programm alles eine Zeile ohne Umbrüche
my_proc->addArgument("jpegtopnm " +bild+ " | pnmscale -xysize 768 576 |
pnmpad -black -width=768 -height=576 |
pnmscale -xscale 0.916667 | ppmntsc --pal |
ppmtoyuv4mpeg2 | mpeg2enc -v 0 -f 6 -F 3 -a 2 -n p -T 120 |
mplex -v 0 -f 6 -o " +bild+ ".mpg ");


if( !my_proc->start() )
QMessageBox::information(this, tr("Info..."),tr("couldn´t start process"),QMessageBox::Ok);


zahl++;
bild = lb_seg_items->text (zahl);
}
}


my_proc->start() rufe ich nicht explizit auf, aber bei den anderen Prozessen geht es auch, wenn ich nur den "Negativaufruf" mit

if( !my_proc->start() )

mache, das impliziert doch ein my_proc->start() oder

Vielen Dank

tuxipuxi
12-03-2003, 09:37
ich _glaube_ das das start() impliziert, probier das aber am besten mal mit explizitem aufruf aus.


probier doch mal, dein command in einen QString zu tun und den dann als argumente zu uebergeben,
sprich process->addArgument( stringwithcommand );

ich weiss zwar ehrlich gesagt nicht wo das den grossen unterschied machen sollte, aber meine aufrufe klappen eigentlich mit QProcess.. an den pipes kann es eigentlich nicht liegen


gruss tuxipuxi

celindir
12-03-2003, 09:50
Das mit dem stringwithcommand werde ich mal ausprobieren.

Der Unterschied könnte daran liegen, dass die Argumente in QProcess eine QStringList ist und daher mit dem stringwithcommand vielleicht nur ein Eintag erstellt wird.

Ich melde mich dann nochmal, wenn ich es heute abend getestet habe.

anda_skoa
12-03-2003, 12:16
start() ist start() :)

Was du mit dem Returnwert machst, ist egal, da start() da bereits exekutiert worden ist.

Falls es mit QProcess nicht klappt und die Anwendungen eine KDE Anwendung ist, solltest du es mit KProcess versuchen.
In Kombination mit setUseShell

Ciao,
_

tuxipuxi
12-03-2003, 17:12
arg ich idiot war glaub ich noch nicht ganz wach :) ...
ich hab bei


if(!process->start())


an "wenn der process nicht gestartet ist,dann" und nicht "wenn process nicht gestartet werden kann" ;)

@anda_skoa ,

ich glaub das muss nicht sein... es hat nicht jeder die kdelibs

anda_skoa
12-03-2003, 17:59
Original geschrieben von tuxipuxi
@anda_skoa ,

ich glaub das muss nicht sein... es hat nicht jeder die kdelibs

Darum habe ich ja gesagt: "falls es eine KDE Anwendung ist"

Ciao,
_

celindir
13-03-2003, 11:49
Original geschrieben von anda_skoa
Es läßt sich womöglich auch ohne Script machen, wenn du KProcess::setUseShell benutzt.
Hallo anda_soka,

habe gerade noch folgendes gefunden:

KShellProcess (http://developer.kde.org/documentation/library/3.0-api/classref/kdecore/KShellProcess.html)

Sieht aus, als könnte ich damit genau mein Ziel erreichen.

Danke für die Anregung!

anda_skoa
13-03-2003, 14:10
Original geschrieben von celindir
Hallo anda_soka,

habe gerade noch folgendes gefunden:

KShellProcess (http://developer.kde.org/documentation/library/3.0-api/classref/kdecore/KShellProcess.html)

Sieht aus, als könnte ich damit genau mein Ziel erreichen.

Danke für die Anregung!

In der KShellProcess Doku zu KDE3.1 steht, dass diese Funktion eben von KProcess in Kombinatio mit setUseShell übernommen wurde.

KShellProcess ist natürlich sicherer, wenn man auch ältere KDE3 Versionen bedienen möchte.

Sollte mir angewöhnen, bei Fragen nur in der KDE3.0 Doku nachzusehen :)

Ciao,
_

celindir
14-03-2003, 15:01
Hallo zusammen,

leider haben meine ersten Versuche nicht geklappt, weder mit KShellProcess
noch mit process->addArgument( stringwithcommand ).

Aber da das Ganze ja im Moment auch mit Aufruf des Bash-Sripts ganz gut geht, habe ich das erst mal auf die lange Bank geschoben. Ich muss mich bei dem Programm erst mal um die Dinge kümmern, die noch gar nicht funktionieren, und davon gibt es noch reichlich ;)


Deshalb werde ich Euch bestimmt noch mit einigen anderen Newbie-Fragen nerven:D

An dieser Stelle erstmal herzlichen Dank für die Hilfe!!

Gruß