2012-04-01 7 views
0

Ich habe den Code:Qt: Wie verbinde ich einen QPushButton einer "DialogClass1", um einen QProcess in einer "Class2" zu beenden?

void Processmethod() 
{ 

    QDialog *ProcessMessage = new QDialog;  
    // HOW TO CONNECT THE DIALOGS PUSHBUTTON TO KILL THE PROCESS called in processmethodONE() ? 
    Ui::DialogProcessMessage Dialog;  //polymorphy  
    Dialog.setupUi(ProcessMessage);    
    ProcessMessage->setModal(true); 
    ProcessMessage->setAttribute(Qt::WA_DeleteOnClose); 
    ProcessMessage->show(); 

    processmethodONE(); 
} 

void processmethodONE() 
{ 
    QString ProcessCommand = "w8 " + blablubli";    

    Prozess.setWorkingDirectory(Path);   //QProcess "Prozess" is globaly defined 
    Prozess.setStandardOutputFile(Path);  //in my class 
    QEventLoop loop;                 
    connect(&Prozess, SIGNAL(error(QProcess::ProcessError)), &loop, SLOT(quit())); 
    connect(&Prozess, SIGNAL(finished(int, QProcess::ExitStatus)), &loop, SLOT(quit())); 
    Prozess.start(ProcessCommand); 
    loop.exec(); 

    QProcess::ExitStatus Status = Prozess.exitStatus(); 

    if (Status == 0) 
    { 
     std::cout <<"Exit-Status: " << Status << " File created!" << std::endl; 
    } 
else 
    { 
     std::cout << "Exit-Status: " << Status << " Error-Code: " << Prozess.error() << "Process failed!" << std::endl; 
    } 
} 

Was ich tun möchte, ist die QProcess „Prozess“ von einem der Dialoge Tastern zu töten. Die Klasse "Ui :: DialogProcessMessage" kann nicht bearbeitet/spezifiziert werden, da es sich um die Klasse handelt, die direkt von der QtDesigner Ui-Datei erstellt wurde und daher bei jeder Bearbeitung der Ui-Datei mit QtDesigner überschrieben wird. Wie kann ich damit umgehen? Grüße

+1

Vermeiden Sie lokale Ereignisschleifen. Sonst betrittst du eine Welt des Schmerzes. Lokale Ereignisschleifen verursachen alle Arten von Reentrancy-Problemen (da während der Ausführung beliebige Ereignisse auftreten können, beispielsweise kann jemand ProcessMethod() und processMethodOne() auslösen, während die Schleife noch ausgeführt wird), die am besten vermieden werden, indem lokale Ereignisschleifen verwendet werden. –

+0

Ich werde die Haupt-GUI durch den Dialog blockiert haben, so dass niemand etwas auslöst, während der Prozess läuft, außer dass der Prozess abgebrochen wird. Das Eingeben einer lokalen Ereignisschleife sollte also kein Problem sein. :) – Streight

+0

@FrankOsterfeld: Der OP hat den Vorschlag bekommen, eine lokale Ereignisschleife von seiner anderen Frage zu verwenden: http://stackoverflow.com/questions/9956304/qprocess-does- Nicht-vollständige-Erstellung-Datei. Ich stimme diesem Ansatz auch nicht persönlich zu. Ich denke, es sollte benachrichtigt werden, wenn es über Signale erfolgt. – jdi

Antwort

1

Die Lösung wird nur

connect(Dialog.pushButtonAbort, SIGNAL(clicked()), &Prozess, SLOT(kill())); 

Wahrscheinlich, es zu benutzen, denn Dialog ist die „Hauptaufgabe“ in diesem Fall und das Objekt „Process“ wird nur verwendet, um es zu spezifizieren. Habe das aus dem QDeveloper Forum.

THX für die Unterstützung Jungs.

+1

Sollte das SIGNAL 'SIGNAL (clicked()) 'lesen? Schön, dass Sie die Lösung gefunden haben! – jdi

+0

ja richtig, änderte es. – Streight

1

Nachdem Sie dies tun:

Dialog.setupUi(ProcessMessage); 

... ProcessMessage jetzt alle Widgets hat, die in Ui::DialogProcessMessage entworfen wurden. Sie können auf alle Elemente mit ihren Namen zugreifen.

connect(ProcessMessage->pushButton, SIGNAL(clicked()), &loop, SLOT(quit())); 

Ich könnte falsch sein, wie die Kinder zu beziehen, -> oder ., da ich eigentlich PyQt verwenden. Aber ich bin sicher, du hast die Idee.

Normalerweise würden Sie Ihre Klasse von Anfang an so entwerfen, dass sie von der UI-Klasse erbt, so dass Sie in Ihrem Konstruktor nur setupUi(this) sagen müssen.

Momentan scheint Ihre processOne-Funktion keinen Verweis auf den Dialog zu haben, daher müssen Sie ihn eventuell als arg übergeben. Oder schließen Sie es früher direkt an den Prozess:

connect(ProcessMessage->pushButton, SIGNAL(clicked()), &Prozess, SLOT(kill())); 
+0

"Normalerweise würden Sie Ihre Klasse von Anfang an so entwerfen, dass sie von der UI-Klasse erbt, so dass Sie nur SetupUi (this) in Ihrem Konstruktor sagen müssen." Nicht wirklich, das übliche Muster ist heutzutage, das UI-Objekt als Mitglied des Widgets zu haben. Dies folgt der Regel "Zusammensetzung über Vererbung". –

+0

Ich habe jetzt versucht, Ihre vorgeschlagenen connect-Methoden nach 'Dialog.setupUi (ProcessMessage);' .When mit 'connect (ProcessMessage-> pushButton, SIGNAL (angeklickt()), & Prozess, SLOT (kill()));' Ich bekomme der Fehler: 'Form.cpp: In Elementfunktion 'Int UnterklasseGUI Processmethod()": Form.cpp: 5152: 29: Fehler: Klasse QDialog hat kein Mitglied mit Name' PushButton ' make: *** [Form.o] Fehler 1 ', wenn' connect (ProcessMessage-> pushButton, SIGNAL (clicked()), & loop, SLOT (quit())); 'Ich bekomme den gleichen Fehler plus' Form.cpp: 5151: 80: error: ' Schleife 'wurde in diesem Bereich nicht deklariert', wo dies für mich logisch ist. Irgendeine Idee? – Streight

+0

Ja, Sie können nicht buchstäblich tun, was ich tippte. Sie müssen ein wenig versuchen, dies auf Ihren eigenen Code anzuwenden. Wie heißt Ihr eigener QPushButton? von Ihrem UI-Design? Ich wählte nur zufällig "PushButton". Auch, wie ich schon sagte, Sie müssen wahrscheinlich das zweite Beispiel tun, weil Ihre QEventLoop obje ct existiert nicht im selben Umfang wie Ihr Dialog. Es ist im Grunde nur, wie Sie die Dinge eingerichtet haben. – jdi