Seite 1 von 1

Qt-Programm von Kommandozeile aus starten

Verfasst: 1. Dezember 2011 10:34
von qtNiko
hi,

ich möchte mein Simulationsprogramm das eine GUI mit Qt besitzt, von Kommandozeile aus starten.

In der grafischen Oberfläche muss ich vor dem Start eine Datei laden durch Klick auf einen ersten Button und zum Start auf einen zweiten Button drücken. Dies soll von der Kommandozeile her durch Aufruf des Qt-Programms mit einem Parameter möglich sein.

Das GUI-Programm heißt IP_Simulation und wird folgendermaßen bedient:
Button1, "Workspacedatei" ---> Laden der Datei durch readWkspFile()
Button2, "Start" ---> Start der Simulation mit den Angaben in der Workspacedatei

von der Kommandozeile stelle ich mir das so vor:
./IP_Simulation name_of_workspacedatei

Meine bisherige "Lösung", die nicht funktioniert:
in main.cpp:

Code: Alles auswählen

int main(int argc, char *argv[])
{
	int i;
	printf("%d Parameter:\n", argc);
	for (i=0; i<argc; i++)                  // Kontrolle der übergebenen Parameter
		printf("   %s \n", argv[i]);

	if (argc > 1)
    	  strcpy(wkspcStr,argv[1]);    // static char wkspcStr[180] in ipsimu.h definiert
                                                                 // und hier mit #include bekannt gemacht
	printf("wkspcStr: %s\n",wkspcStr);  // Kontrolle

    QApplication app(argc, argv);
    app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));
    ipSimuDesign *simWindow = new ipSimuDesign;
    simWindow->show();
 
    return app.exec();
}
Im Constructor in ip_simu.cpp ganz am Ende:

Code: Alles auswählen

...
    // ipsimu.h ist auch hier mit #include bekannt und damit wkspcStr.
    // Allerdings ist hier der String wkspcStr leer - warum auch immer.
    // deshalb wird hier probeweise wkspcStr direkt gefüllt
    strcpy(wkspcStr,"/home/kpdip/IP_Simulation/worksp/testsequ.wkspc");
    qDebug() << "Parameter: " <<  wkspcStr;
    if (strlen(wkspcStr) > 0) {	// eine Workspace-Datei wurde beim Aufruf uebergeben
    	wkspFile->setFileName((QString)wkspcStr);
    	if (wkspFile->open(QIODevice::ReadOnly | QIODevice::Text)) {
    		int err = readWkspFile(wkspFile, VonAnfang);    // Einlesen der Workspacedatei
			if (err == 0) {
				wkspcChanged=false;
				steuerAblauf(1);         // dies ist eine slot-function, die von der GUI
                                                                              // durch Klick auf Button2 aufgerufen wird;
                                                                              // damit wird die Simulation gestartet
			}
    	}
    	else printf("Abbruch: Workspace-Datei kann nicht geoeffnet werden!\n");
	}
Das funktioniert soweit (bis auf das Problemchen, dass wkspcStr hier plötzlich leer ist).
Die Simulation läuft, aber die grafische Oberfläche ist nicht zu sehen. Erst nach Beendigung der Simulation erscheint sie.
Man sollte aber natürlich während der Simulation die Darstellungen auf der grafischen Oberfläche bereits sehen.

Wie geht das?
Tipps sind sehr willkommen :?

Re: Qt-Programm von Kommandozeile aus starten

Verfasst: 1. Dezember 2011 11:41
von archer
Verwende doch QCoreApplication::arguments() im Konstruktor von ip_simu.cpp
um die Parameter auszuwerten, da hast du gleich eine QStringList mit QStrings.
In der main mußt du dann gar keine Auswertung und kein Umkopieren machen.

Re: Qt-Programm von Kommandozeile aus starten

Verfasst: 1. Dezember 2011 11:42
von solarix
1. Verwende nie globale Variablen

2. Verwende in einer Qt-Umgebung auch QString..

3. Du kannst jederzeit und überall im Programm die Argumente (QCoreApplication sei Dank) ermitteln (http://doc.qt.nokia.com/latest/qcoreapp ... -arguments)

4. Wenn du das Widget nicht siehst ist "steuerAblauf(1)" blockierend (ohne Screen-Update). Das würde aber auch bedeutet, dass auch auch im normalen Betrieb (Dateiauswahl via GUI) die GUI während der Simulation "gefriert"..

hth!

Re: Qt-Programm von Kommandozeile aus starten

Verfasst: 1. Dezember 2011 17:00
von qtNiko
Danke für die Tipps.

steuerAblauf verwende ich in der GUI und kann die ganze Simulation life mitansehen.