QProcess Class

Die Klasse QProcess wird verwendet, um externe Programme zu starten und mit ihnen zu kommunizieren. Mehr...

Kopfzeile: #include <QProcess>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Vererbt: QIODevice

Hinweis: Alle Funktionen in dieser Klasse sind reentrant.

Öffentliche Typen

struct CreateProcessArguments
(since 6.6) struct UnixProcessParameters
CreateProcessArgumentModifier
enum ExitStatus { NormalExit, CrashExit }
enum InputChannelMode { ManagedInputChannel, ForwardedInputChannel }
enum ProcessChannel { StandardOutput, StandardError }
enum ProcessChannelMode { SeparateChannels, MergedChannels, ForwardedChannels, ForwardedErrorChannel, ForwardedOutputChannel }
enum ProcessError { FailedToStart, Crashed, Timedout, WriteError, ReadError, UnknownError }
enum ProcessState { NotRunning, Starting, Running }
(since 6.6) enum class UnixProcessFlag { CloseFileDescriptors, CreateNewSession, DisconnectControllingTerminal, IgnoreSigPipe, ResetIds, …, UseVFork }
flags UnixProcessFlags

Öffentliche Funktionen

QProcess(QObject *parent = nullptr)
virtual ~QProcess()
QStringList arguments() const
(since 6.0) std::function<void ()> childProcessModifier() const
void closeReadChannel(QProcess::ProcessChannel channel)
void closeWriteChannel()
QProcess::CreateProcessArgumentModifier createProcessArgumentsModifier() const
QProcess::ProcessError error() const
int exitCode() const
QProcess::ExitStatus exitStatus() const
(since 6.7) void failChildProcessModifier(const char *description, int error = 0)
QProcess::InputChannelMode inputChannelMode() const
QString nativeArguments() const
QProcess::ProcessChannelMode processChannelMode() const
QProcessEnvironment processEnvironment() const
qint64 processId() const
QString program() const
QByteArray readAllStandardError()
QByteArray readAllStandardOutput()
QProcess::ProcessChannel readChannel() const
void setArguments(const QStringList &arguments)
(since 6.0) void setChildProcessModifier(const std::function<void ()> &modifier)
void setCreateProcessArgumentsModifier(QProcess::CreateProcessArgumentModifier modifier)
void setInputChannelMode(QProcess::InputChannelMode mode)
void setNativeArguments(const QString &arguments)
void setProcessChannelMode(QProcess::ProcessChannelMode mode)
void setProcessEnvironment(const QProcessEnvironment &environment)
void setProgram(const QString &program)
void setReadChannel(QProcess::ProcessChannel channel)
void setStandardErrorFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate)
void setStandardInputFile(const QString &fileName)
void setStandardOutputFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate)
void setStandardOutputProcess(QProcess *destination)
(since 6.6) void setUnixProcessParameters(const QProcess::UnixProcessParameters &params)
(since 6.6) void setUnixProcessParameters(QProcess::UnixProcessFlags flagsOnly)
void setWorkingDirectory(const QString &dir)
void start(const QString &program, const QStringList &arguments = {}, QIODeviceBase::OpenMode mode = ReadWrite)
void start(QIODeviceBase::OpenMode mode = ReadWrite)
(since 6.0) void startCommand(const QString &command, QIODeviceBase::OpenMode mode = ReadWrite)
bool startDetached(qint64 *pid = nullptr)
QProcess::ProcessState state() const
(since 6.6) QProcess::UnixProcessParameters unixProcessParameters() const
bool waitForFinished(int msecs = 30000)
bool waitForStarted(int msecs = 30000)
QString workingDirectory() const

Reimplementierte öffentliche Funktionen

virtual qint64 bytesToWrite() const override
virtual void close() override
virtual bool isSequential() const override
virtual bool open(QIODeviceBase::OpenMode mode = ReadWrite) override
virtual bool waitForBytesWritten(int msecs = 30000) override
virtual bool waitForReadyRead(int msecs = 30000) override

Öffentliche Slots

void kill()
void terminate()

Signale

void errorOccurred(QProcess::ProcessError error)
void finished(int exitCode, QProcess::ExitStatus exitStatus = NormalExit)
void readyReadStandardError()
void readyReadStandardOutput()
void started()
void stateChanged(QProcess::ProcessState newState)

Statische öffentliche Mitglieder

int execute(const QString &program, const QStringList &arguments = {})
QString nullDevice()
QStringList splitCommand(QStringView command)
bool startDetached(const QString &program, const QStringList &arguments = {}, const QString &workingDirectory = QString(), qint64 *pid = nullptr)
QStringList systemEnvironment()

Geschützte Funktionen

void setProcessState(QProcess::ProcessState state)

Reimplementierte geschützte Funktionen

virtual qint64 readData(char *data, qint64 maxlen) override

Detaillierte Beschreibung

Ausführen eines Prozesses

Um einen Prozess zu starten, übergeben Sie den Namen und die Befehlszeilenargumente des Programms, das Sie ausführen möchten, als Argumente an start(). Die Argumente werden als einzelne Zeichenketten in einem QStringList übergeben.

Alternativ können Sie das Programm auch mit setProgram() und setArguments() starten und dann start() oder open() aufrufen.

Der folgende Codeschnipsel führt beispielsweise das Analoguhr-Beispiel im Fusion-Stil auf X11-Plattformen aus, indem er Zeichenketten mit "-style" und "fusion" als zwei Elemente in der Liste der Argumente übergibt:

    QObject *parent;
    ...
    QString program = "./path/to/Qt/examples/widgets/analogclock";
    QStringList arguments;
    arguments << "-style" << "fusion";

    QProcess *myProcess = new QProcess(parent);
    myProcess->start(program, arguments);

QProcess wechselt dann in den Zustand Starting, und wenn das Programm gestartet ist, wechselt QProcess in den Zustand Running und gibt started() aus.

QProcess erlaubt es Ihnen, einen Prozess als sequentielles E/A-Gerät zu behandeln. Sie können in den Prozess schreiben und von ihm lesen, so wie Sie mit QTcpSocket auf eine Netzwerkverbindung zugreifen würden. Sie können dann in die Standardeingabe des Prozesses schreiben, indem Sie write() aufrufen, und die Standardausgabe lesen, indem Sie read(), readLine() und getChar() aufrufen. Da er QIODevice erbt, kann QProcess auch als Eingabequelle für QXmlReader verwendet werden, oder um Daten zu erzeugen, die mit QNetworkAccessManager hochgeladen werden.

Wenn der Prozess beendet wird, tritt QProcess wieder in den Zustand NotRunning (den Ausgangszustand) ein und sendet finished().

Das Signal finished() liefert den Exit-Code und den Exit-Status des Prozesses als Argumente, und Sie können auch exitCode() aufrufen, um den Exit-Code des letzten beendeten Prozesses zu erhalten, und exitStatus(), um dessen Exit-Status zu erhalten. Wenn zu irgendeinem Zeitpunkt ein Fehler auftritt, gibt QProcess das Signal errorOccurred() aus. Sie können auch error() aufrufen, um den Typ des zuletzt aufgetretenen Fehlers zu ermitteln, und state(), um den aktuellen Prozessstatus zu ermitteln.

Hinweis: QProcess wird auf VxWorks, iOS, tvOS oder watchOS nicht unterstützt.

Finden der ausführbaren Datei

Das auszuführende Programm kann entweder durch den Aufruf setProgram() oder direkt im Aufruf start() festgelegt werden. Der Aufruf von start() mit dem Programmnamen und den Argumenten ist gleichbedeutend mit dem Aufruf von setProgram() und setArguments() vor dieser Funktion und dem anschließenden Aufruf der Überladung ohne diese Parameter.

QProcess interpretiert den Programmnamen auf eine von drei verschiedenen Arten, ähnlich wie Unix-Shells und der Windows-Befehlsinterpreter in ihren eigenen Befehlszeilen arbeiten:

  • Handelt es sich bei dem Programmnamen um einen absoluten Pfad, dann wird genau diese ausführbare Datei gestartet und QProcess führt keine Suche durch.
  • Wenn der Programmname ein relativer Pfad mit mehr als einer Pfadkomponente ist (d.h. er enthält mindestens einen Schrägstrich), ist das Startverzeichnis, in dem dieser relative Pfad gesucht wird, betriebssystemabhängig: unter Windows ist es das aktuelle Arbeitsverzeichnis des Elternprozesses, während es unter Unix dasjenige ist, das mit setWorkingDirectory() festgelegt wurde.
  • Wenn der Programmname ein einfacher Dateiname ohne Schrägstriche ist, ist das Verhalten betriebssystemabhängig. Auf Unix-Systemen durchsucht QProcess die Umgebungsvariable PATH; unter Windows wird die Suche vom Betriebssystem durchgeführt, und zwar zuerst im aktuellen Verzeichnis des Elternprozesses und dann in der Umgebungsvariablen PATH (eine vollständige Liste finden Sie in der Dokumentation zu CreateProcess ).

Um plattformabhängiges Verhalten oder Probleme mit der Art und Weise, wie die aktuelle Anwendung gestartet wurde, zu vermeiden, ist es ratsam, immer einen absoluten Pfad zu der zu startenden ausführbaren Datei zu übergeben. Für Hilfsbinärdateien, die mit der Anwendung ausgeliefert werden, kann man einen solchen Pfad konstruieren, der mit QCoreApplication::applicationDirPath() beginnt. Um explizit eine ausführbare Datei zu starten, die relativ zu dem mit setWorkingDirectory() festgelegten Verzeichnis gefunden werden soll, verwenden Sie einen Programmpfad, der mit "./" bzw. "../" beginnt.

Unter Windows ist das Suffix ".exe" für die meisten Anwendungen nicht erforderlich, mit Ausnahme derer, die in der CreateProcess-Dokumentation beschrieben sind. Außerdem wandelt QProcess die Schrägstriche im Unix-Stil in Windows-Pfad-Backslashes für den Programmnamen um. Dadurch kann Code, der QProcess verwendet, plattformübergreifend geschrieben werden, wie in den obigen Beispielen gezeigt.

QProcess unterstützt nicht die direkte Ausführung von eingebauten Funktionen der Unix-Shell oder des Windows-Befehlsinterpreters, wie z. B. den Befehl cmd.exe's dir oder den export der Bourne-Shell. Unter Unix werden zwar viele Shell-Build-Ins auch als separate ausführbare Dateien bereitgestellt, aber ihr Verhalten kann sich von den als Build-Ins implementierten Funktionen unterscheiden. Um diese Befehle auszuführen, sollten Sie den Interpreter explizit mit geeigneten Optionen ausführen. Bei Unix-Systemen starten Sie "/bin/sh" mit zwei Argumenten: "-c" und eine Zeichenkette mit der auszuführenden Befehlszeile. Unter Windows verwenden Sie aufgrund der nicht standardisierten Art und Weise, wie cmd.exe die Befehlszeile parst, setNativeArguments() (zum Beispiel "/c dir d:").

Umgebungsvariablen

Die QProcess-API bietet Methoden, um die Umgebungsvariablen zu manipulieren, die der Kindprozess sehen wird. Standardmäßig hat der Kindprozess eine Kopie der Umgebungsvariablen des aktuellen Prozesses, die zum Zeitpunkt des Aufrufs der Funktion start() existieren. Das bedeutet, dass alle Änderungen, die mit qputenv() vor diesem Aufruf durchgeführt wurden, in der Umgebung des Kindprozesses wiedergegeben werden. Beachten Sie, dass QProcess keinen Versuch unternimmt, Race Conditions mit qputenv() in anderen Threads zu verhindern. Es wird daher empfohlen, qputenv() nach dem ersten Start der Anwendung zu vermeiden.

Die Umgebung für ein bestimmtes Child kann mit den Funktionen processEnvironment() und setProcessEnvironment() geändert werden, die die Klasse QProcessEnvironment verwenden. Standardmäßig gibt processEnvironment() ein Objekt zurück, für das QProcessEnvironment::inheritsFromParent() wahr ist. Das Setzen einer Umgebung, die nicht vom Elternteil geerbt hat, führt dazu, dass QProcess genau diese Umgebung für das Kind verwendet, wenn es gestartet wird.

Das normale Szenario beginnt mit der aktuellen Umgebung durch den Aufruf von QProcessEnvironment::systemEnvironment() und fährt dann mit dem Hinzufügen, Ändern oder Entfernen bestimmter Variablen fort. Der resultierende Variablenplan kann dann mit setProcessEnvironment() auf einen QProcess angewendet werden.

Es ist möglich, alle Variablen aus der Umgebung zu entfernen oder mit einer leeren Umgebung zu beginnen, indem man den Standardkonstruktor QProcessEnvironment() verwendet. Dies ist außerhalb kontrollierter und systemspezifischer Bedingungen nicht ratsam, da es Systemvariablen geben kann, die in der aktuellen Prozessumgebung gesetzt sind und für die korrekte Ausführung des Kindprozesses erforderlich sind.

Unter Windows kopiert QProcess die Umgebungsvariablen "PATH" und "SystemRoot" des aktuellen Prozesses, wenn sie nicht gesetzt wurden. Es ist nicht möglich, sie vollständig zu deaktivieren, aber es ist möglich, sie auf leere Werte zu setzen. Wird "PATH" unter Windows auf einen leeren Wert gesetzt, wird der Kindprozess wahrscheinlich nicht starten.

Kommunikation über Kanäle

Prozesse haben zwei vordefinierte Ausgabekanäle: Der Standard-Ausgabekanal (stdout) liefert die reguläre Konsolenausgabe, und der Standard-Fehlerkanal (stderr) liefert in der Regel die Fehler, die der Prozess ausgibt. Diese Kanäle stellen zwei separate Datenströme dar. Sie können zwischen ihnen umschalten, indem Sie setReadChannel() aufrufen. QProcess gibt readyRead() aus, wenn Daten auf dem aktuellen Lesekanal verfügbar sind. Es gibt auch readyReadStandardOutput() aus, wenn neue Standardausgabedaten verfügbar sind, und wenn neue Standardfehlerdaten verfügbar sind, wird readyReadStandardError() ausgegeben. Anstatt read(), readLine() oder getChar() aufzurufen, können Sie explizit alle Daten von einem der beiden Kanäle lesen, indem Sie readAllStandardOutput() oder readAllStandardError() aufrufen.

Die Terminologie für die Kanäle kann irreführend sein. Beachten Sie, dass die Ausgabekanäle des Prozesses den Lesekanälen von QProcess entsprechen, während die Eingabekanäle des Prozesses den Schreibkanälen von QProcess entsprechen. Das liegt daran, dass das, was wir mit QProcess lesen, die Ausgabe des Prozesses ist, und das, was wir schreiben, die Eingabe des Prozesses.

QProcess kann die beiden Ausgabekanäle zusammenführen, so dass die Standardausgabe und die Standardfehlerdaten des laufenden Prozesses beide den Standardausgabekanal verwenden. Rufen Sie setProcessChannelMode() mit MergedChannels auf, bevor Sie den Prozess starten, um diese Funktion zu aktivieren. Sie haben auch die Möglichkeit, die Ausgabe des laufenden Prozesses an den aufrufenden Hauptprozess weiterzuleiten, indem Sie ForwardedChannels als Argument übergeben. Es ist auch möglich, nur einen der Ausgabekanäle weiterzuleiten - normalerweise würde man ForwardedErrorChannel verwenden, aber es gibt auch ForwardedOutputChannel. Beachten Sie, dass die Weiterleitung von Kanälen in der Regel eine schlechte Idee für GUI-Anwendungen ist - Sie sollten Fehler stattdessen grafisch darstellen.

Bestimmte Prozesse benötigen spezielle Umgebungseinstellungen, um zu funktionieren. Sie können Umgebungsvariablen für Ihren Prozess setzen, indem Sie setProcessEnvironment() aufrufen. Um ein Arbeitsverzeichnis zu setzen, rufen Sie setWorkingDirectory() auf. Standardmäßig werden die Prozesse im aktuellen Arbeitsverzeichnis des aufrufenden Prozesses ausgeführt.

Die Positionierung und die Z-Reihenfolge von Fenstern, die zu GUI-Anwendungen gehören, die mit QProcess gestartet werden, werden durch das zugrundeliegende Windowing-System gesteuert. Für Qt 5-Anwendungen kann die Positionierung mit der Kommandozeilenoption -qwindowgeometry festgelegt werden; X11-Anwendungen akzeptieren in der Regel die Kommandozeilenoption -geometry.

Synchrone Prozess-API

QProcess bietet eine Reihe von Funktionen, die es ermöglichen, den Prozess ohne eine Ereignisschleife zu verwenden, indem der aufrufende Thread angehalten wird, bis bestimmte Signale ausgegeben werden:

Der Aufruf dieser Funktionen vom Haupt-Thread (dem Thread, der QApplication::exec() aufruft) kann dazu führen, dass Ihre Benutzeroberfläche einfriert.

Das folgende Beispiel führt gzip aus, um die Zeichenkette "Qt rocks!" zu komprimieren, ohne eine Ereignisschleife:

    QProcess gzip;
    gzip.start("gzip", QStringList() << "-c");
    if (!gzip.waitForStarted())
        return false;

    gzip.write("Qt rocks!");
    gzip.closeWriteChannel();

    if (!gzip.waitForFinished())
        return false;

    QByteArray result = gzip.readAll();

Siehe auch QBuffer, QFile, und QTcpSocket.

Dokumentation der Mitgliedstypen

QProcess::CreateProcessArgumentModifier

Hinweis: Diese Typisierung ist nur auf dem Windows-Desktop verfügbar.

Unter Windows verwendet QProcess die Win32-API-Funktion CreateProcess, um Kindprozesse zu starten. Während QProcess eine bequeme Möglichkeit bietet, Prozesse zu starten, ohne sich um Plattformdetails zu kümmern, ist es in manchen Fällen wünschenswert, die Parameter, die an CreateProcess übergeben werden, fein abzustimmen. Dies geschieht, indem man eine CreateProcessArgumentModifier Funktion definiert und sie an setCreateProcessArgumentsModifier übergibt.

Eine CreateProcessArgumentModifier Funktion nimmt einen Parameter entgegen: einen Zeiger auf eine CreateProcessArguments Struktur. Die Mitglieder dieser Struktur werden an CreateProcess übergeben, nachdem die Funktion CreateProcessArgumentModifier aufgerufen wurde.

Das folgende Beispiel zeigt, wie man benutzerdefinierte Flags an CreateProcess übergibt. Wenn ein Konsolenprozess B von einem Konsolenprozess A gestartet wird, verwendet QProcess standardmäßig das Konsolenfenster von Prozess A für Prozess B wieder. In diesem Beispiel wird stattdessen ein neues Konsolenfenster mit einem eigenen Farbschema für den Kindprozess B erstellt.

    QProcess process;
    process.setCreateProcessArgumentsModifier([] (QProcess::CreateProcessArguments *args)
    {
        args->flags |= CREATE_NEW_CONSOLE;
        args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES;
        args->startupInfo->dwFlags |= STARTF_USEFILLATTRIBUTE;
        args->startupInfo->dwFillAttribute = BACKGROUND_BLUE | FOREGROUND_RED
                                           | FOREGROUND_INTENSITY;
    });
    process.start("C:\\Windows\\System32\\cmd.exe", QStringList() << "/k" << "title" << "The Child Process");

Siehe auch QProcess::CreateProcessArguments und setCreateProcessArgumentsModifier().

enum QProcess::ExitStatus

Diese Aufzählung beschreibt die verschiedenen Exit-Status von QProcess.

KonstanteWertBeschreibung
QProcess::NormalExit0Der Prozess wurde normal beendet.
QProcess::CrashExit1Der Prozess ist abgestürzt.

Siehe auch exitStatus().

enum QProcess::InputChannelMode

Dieses Enum beschreibt die Prozesseingangskanalmodi von QProcess. Übergeben Sie einen dieser Werte an setInputChannelMode(), um den aktuellen Schreibkanalmodus einzustellen.

KonstanteWertBeschreibung
QProcess::ManagedInputChannel0QProcess verwaltet die Eingabe des laufenden Prozesses. Dies ist der Standard-Eingabekanalmodus von QProcess.
QProcess::ForwardedInputChannel1QProcess leitet die Eingaben des Hauptprozesses an den laufenden Prozess weiter. Der Kindprozess liest seine Standardeingabe von der gleichen Quelle wie der Hauptprozess. Beachten Sie, dass der Hauptprozess nicht versuchen darf, seine Standardeingabe zu lesen, während der Kindprozess läuft.

Siehe auch setInputChannelMode().

enum QProcess::ProcessChannel

Diese Aufzählung beschreibt die vom laufenden Prozess verwendeten Prozesskanäle. Übergeben Sie einen dieser Werte an setReadChannel(), um den aktuellen Lesekanal von QProcess einzustellen.

KonstanteWertBeschreibung
QProcess::StandardOutput0Die Standardausgabe (stdout) des laufenden Prozesses.
QProcess::StandardError1Der Standardfehler (stderr) des laufenden Prozesses.

Siehe auch setReadChannel().

enum QProcess::ProcessChannelMode

Diese Aufzählung beschreibt die Prozessausgangskanalmodi von QProcess. Übergeben Sie einen dieser Werte an setProcessChannelMode(), um den aktuellen Lesekanalmodus einzustellen.

KonstanteWertBeschreibung
QProcess::SeparateChannels0QProcess verwaltet die Ausgabe des laufenden Prozesses, wobei Standardausgabe- und Standardfehlerdaten in getrennten internen Puffern gehalten werden. Sie können den aktuellen Lesekanal von QProcess auswählen, indem Sie setReadChannel() aufrufen. Dies ist der Standardkanalmodus von QProcess.
QProcess::MergedChannels1QProcess führt die Ausgabe des laufenden Prozesses in den Standardausgabekanal (stdout) zusammen. Der Standard-Fehlerkanal (stderr) empfängt keine Daten. Die Standardausgabe und die Standardfehlerdaten des laufenden Prozesses werden verschachtelt. Bei abgekoppelten Prozessen wird die zusammengefasste Ausgabe des laufenden Prozesses an den Hauptprozess weitergeleitet.
QProcess::ForwardedChannels2QProcess leitet die Ausgabe des laufenden Prozesses an den Hauptprozess weiter. Alles, was der Kindprozess in seine Standardausgabe und Standardfehler schreibt, wird in die Standardausgabe und Standardfehler des Hauptprozesses geschrieben.
QProcess::ForwardedErrorChannel4QProcess verwaltet die Standardausgabe des laufenden Prozesses, leitet aber dessen Standardfehler an den Hauptprozess weiter. Dies spiegelt die typische Verwendung von Kommandozeilenwerkzeugen als Filter wider, bei denen die Standardausgabe an einen anderen Prozess oder eine Datei weitergeleitet wird, während der Standardfehler zu Diagnosezwecken auf die Konsole ausgegeben wird. (Dieser Wert wurde in Qt 5.2 eingeführt.)
QProcess::ForwardedOutputChannel3Komplementär zu ForwardedErrorChannel. (Dieser Wert wurde in Qt 5.2 eingeführt.)

Hinweis: Windows unterdrückt absichtlich die Ausgabe von reinen GUI-Anwendungen an geerbte Konsolen. Dies gilt nicht für Ausgaben, die in Dateien oder Pipes umgeleitet werden. Um die Ausgabe von reinen GUI-Anwendungen auf der Konsole trotzdem weiterzuleiten, müssen Sie SeparateChannels verwenden und die Weiterleitung selbst vornehmen, indem Sie die Ausgabe lesen und in die entsprechenden Ausgabekanäle schreiben.

Siehe auch setProcessChannelMode().

enum QProcess::ProcessError

Diese Aufzählung beschreibt die verschiedenen Arten von Fehlern, die von QProcess gemeldet werden.

KonstanteWertBeschreibung
QProcess::FailedToStart0Der Prozess konnte nicht gestartet werden. Entweder fehlt das aufgerufene Programm, oder Sie haben nicht genügend Berechtigungen oder Ressourcen, um das Programm aufzurufen.
QProcess::Crashed1Der Prozess ist einige Zeit nach dem erfolgreichen Start abgestürzt.
QProcess::Timedout2Die letzte waitFor...()-Funktion hat eine Zeitüberschreitung verursacht. Der Zustand von QProcess ist unverändert, und Sie können versuchen, waitFor...() erneut aufzurufen.
QProcess::WriteError4Beim Versuch, in den Prozess zu schreiben, ist ein Fehler aufgetreten. Der Prozess läuft beispielsweise nicht, oder er hat seinen Eingabekanal geschlossen.
QProcess::ReadError3Ein Fehler trat auf, als versucht wurde, von dem Prozess zu lesen. Zum Beispiel könnte der Prozess nicht laufen.
QProcess::UnknownError5Ein unbekannter Fehler ist aufgetreten. Dies ist der Standardrückgabewert von error().

Siehe auch error().

enum QProcess::ProcessState

Diese Aufzählung beschreibt die verschiedenen Zustände von QProcess.

KonstanteWertBeschreibung
QProcess::NotRunning0Der Prozess läuft nicht.
QProcess::Starting1Der Prozess wird gestartet, aber das Programm ist noch nicht aufgerufen worden.
QProcess::Running2Der Prozess läuft und ist bereit zum Lesen und Schreiben.

Siehe auch state().

[since 6.6] enum class QProcess::UnixProcessFlag
flags QProcess::UnixProcessFlags

Diese Flags können im Feld flags von UnixProcessParameters verwendet werden.

KonstanteWertBeschreibung
QProcess::UnixProcessFlag::CloseFileDescriptors0x0010Schließt alle Dateideskriptoren oberhalb des durch lowestFileDescriptorToClose definierten Schwellenwerts und verhindert, dass ein aktuell geöffneter Deskriptor im Elternprozess versehentlich an den Kindprozess weitergegeben wird. Die Dateideskriptoren stdin, stdout und stderr werden nie geschlossen.
QProcess::UnixProcessFlag::CreateNewSession (since Qt 6.7)0x0040Startet eine neue Prozess-Sitzung, indem er setsid(2) aufruft. Dies ermöglicht es dem Kindprozess, die Sitzung, in der sich der aktuelle Prozess befindet, zu überleben. Dies ist einer der Schritte, die startDetached() unternimmt, um dem Prozess das Trennen zu ermöglichen, und ist auch einer der Schritte, um einen Prozess zu dämonisieren.
QProcess::UnixProcessFlag::DisconnectControllingTerminal (since Qt 6.7)0x0080Verlangt, dass der Prozess die Verbindung zu seinem Kontrollterminal trennt, falls er eines hat. Wenn er keins hat, passiert nichts. Prozesse, die noch mit einem kontrollierenden Terminal verbunden sind, können ein Signal zum Aufhängen (SIGHUP) erhalten, wenn das Terminal geschlossen wird, oder eines der anderen Terminal-Kontrollsignale (SIGTSTP, SIGTTIN, SIGTTOU). Beachten Sie, dass auf einigen Betriebssystemen ein Prozess nur dann die Verbindung zum kontrollierenden Terminal trennen kann, wenn er der Sitzungsleiter ist, was bedeutet, dass das CreateNewSession Flag erforderlich sein kann. Dies ist einer der Schritte zur Daemonisierung eines Prozesses.
QProcess::UnixProcessFlag::IgnoreSigPipe0x0002Setzt das Signal SIGPIPE immer auf ignoriert (SIG_IGN), auch wenn das Flag ResetSignalHandlers gesetzt wurde. Wenn der untergeordnete Prozess versucht, auf seine Standardausgabe oder Standardfehler zu schreiben, nachdem der entsprechende Kanal mit QProcess::closeReadChannel() geschlossen wurde, würde er standardmäßig das Signal SIGPIPE erhalten und sofort beendet werden; mit diesem Flag schlägt der Schreibvorgang ohne Signal fehl und der untergeordnete Prozess kann weiter ausgeführt werden.
QProcess::UnixProcessFlag::ResetIds (since Qt 6.7)0x0100Verwirft jede zurückbehaltene, effektive Benutzer- oder Gruppen-ID, die der aktuelle Prozess möglicherweise noch hat (siehe setuid(2) und setgid(2), sowie QCoreApplication::setSetuidAllowed()). Dies ist nützlich, wenn der aktuelle Prozess setuid oder setgid war und nicht möchte, dass der Kindprozess die erhöhten Privilegien beibehält.
QProcess::UnixProcessFlag::ResetSignalHandlers0x0001Setzt alle Unix-Signalhandler auf ihren Standardzustand zurück (d.h. übergibt SIG_DFL an signal(2)). Dieses Flag ist nützlich, um sicherzustellen, dass ein ignoriertes (SIG_IGN) Signal das Verhalten des Kindprozesses nicht beeinflusst.
QProcess::UnixProcessFlag::UseVFork0x0020Fordert QProcess auf, vfork(2) zu verwenden, um den Kindprozess zu starten. Verwenden Sie dieses Flag, um anzuzeigen, dass die mit setChildProcessModifier() gesetzte Callback-Funktion sicher in der Child-Seite eines vfork(2) ausgeführt werden kann, d.h. der Callback verändert keine nicht-lokalen Variablen (direkt oder durch eine von ihm aufgerufene Funktion) und versucht nicht, mit dem Elternprozess zu kommunizieren. Es ist implementierungsabhängig, ob QProcess tatsächlich vfork(2) verwendet und ob vfork(2) sich vom Standard fork(2) unterscheidet.

Diese Aufzählung wurde in Qt 6.6 eingeführt.

Der Typ UnixProcessFlags ist ein Typedef für QFlags<UnixProcessFlag>. Er speichert eine OR-Kombination von UnixProcessFlag-Werten.

Siehe auch setUnixProcessParameters() und unixProcessParameters().

Dokumentation der Mitgliedsfunktionen

[explicit] QProcess::QProcess(QObject *parent = nullptr)

Konstruiert ein QProcess-Objekt mit der angegebenen parent.

[virtual noexcept] QProcess::~QProcess()

Zerstört das Objekt QProcess, d.h. beendet den Prozess.

Beachten Sie, dass diese Funktion nicht zurückkehrt, bevor der Prozess beendet ist.

QStringList QProcess::arguments() const

Gibt die Befehlszeilenargumente zurück, mit denen der Prozess zuletzt gestartet wurde.

Siehe auch setArguments() und start().

[override virtual] qint64 QProcess::bytesToWrite() const

Reimplements: QIODevice::bytesToWrite() const.

[since 6.0] std::function<void ()> QProcess::childProcessModifier() const

Gibt die Modifikatorfunktion zurück, die zuvor durch den Aufruf von setChildProcessModifier() festgelegt wurde.

Hinweis: Diese Funktion ist nur auf Unix-Plattformen verfügbar.

Diese Funktion wurde in Qt 6.0 eingeführt.

Siehe auch setChildProcessModifier() und unixProcessParameters().

[override virtual] void QProcess::close()

Reimplements: QIODevice::close().

Schließt die gesamte Kommunikation mit dem Prozess und beendet ihn. Nach dem Aufruf dieser Funktion wird QProcess nicht mehr readyRead() ausgeben, und es können keine Daten mehr gelesen oder geschrieben werden.

void QProcess::closeReadChannel(QProcess::ProcessChannel channel)

Schließt den Lesekanal channel. Nach dem Aufruf dieser Funktion empfängt QProcess keine Daten mehr auf diesem Kanal. Alle bereits empfangenen Daten stehen weiterhin zum Lesen zur Verfügung.

Rufen Sie diese Funktion auf, um Speicher zu sparen, wenn Sie nicht an der Ausgabe des Prozesses interessiert sind.

Siehe auch closeWriteChannel() und setReadChannel().

void QProcess::closeWriteChannel()

Legt fest, dass der Schreibkanal von QProcess geschlossen werden soll. Der Kanal wird geschlossen, sobald alle Daten in den Prozess geschrieben worden sind. Nach dem Aufruf dieser Funktion schlagen alle Versuche, in den Prozess zu schreiben, fehl.

Das Schließen des Schreibkanals ist für Programme notwendig, die Eingabedaten lesen, bis der Kanal geschlossen wurde. Zum Beispiel wird das Programm "more" verwendet, um Textdaten in einer Konsole sowohl unter Unix als auch unter Windows anzuzeigen. Es zeigt die Textdaten jedoch erst an, wenn der Schreibkanal von QProcess geschlossen wurde. Beispiel:

QProcess more;
more.start("more");
more.write("Text to display");
more.closeWriteChannel();
// QProcess will emit readyRead() once "more" starts printing

Der Schreibkanal wird implizit geöffnet, wenn start() aufgerufen wird.

Siehe auch closeReadChannel().

QProcess::CreateProcessArgumentModifier QProcess::createProcessArgumentsModifier() const

Gibt eine zuvor eingestellte CreateProcess Modifikatorfunktion zurück.

Hinweis: Diese Funktion ist nur auf der Windows-Plattform verfügbar.

Siehe auch setCreateProcessArgumentsModifier() und QProcess::CreateProcessArgumentModifier.

QProcess::ProcessError QProcess::error() const

Gibt den Typ des zuletzt aufgetretenen Fehlers zurück.

Siehe auch state().

[signal] void QProcess::errorOccurred(QProcess::ProcessError error)

Dieses Signal wird ausgegeben, wenn ein Fehler im Prozess auftritt. Die angegebene error beschreibt die Art des aufgetretenen Fehlers.

[static] int QProcess::execute(const QString &program, const QStringList &arguments = {})

Startet das Programm program mit den Argumenten arguments in einem neuen Prozess, wartet auf dessen Beendigung und gibt dann den Exit-Code des Prozesses zurück. Alle Daten, die der neue Prozess auf die Konsole schreibt, werden an den aufrufenden Prozess weitergeleitet.

Die Umgebung und das Arbeitsverzeichnis werden vom aufrufenden Prozess geerbt.

Die Behandlung der Argumente ist identisch mit der entsprechenden start()-Überladung.

Wenn der Prozess nicht gestartet werden kann, wird -2 zurückgegeben. Wenn der Prozess abstürzt, wird -1 zurückgegeben. Andernfalls wird der Exit-Code des Prozesses zurückgegeben.

Siehe auch start().

int QProcess::exitCode() const

Gibt den Exit-Code des letzten beendeten Prozesses zurück.

Dieser Wert ist nur gültig, wenn exitStatus() NormalExit zurückgibt.

QProcess::ExitStatus QProcess::exitStatus() const

Gibt den Exit-Status des letzten beendeten Prozesses zurück.

Wenn der Prozess unter Windows mit TerminateProcess() aus einer anderen Anwendung beendet wurde, gibt diese Funktion dennoch NormalExit zurück, es sei denn, der Exit-Code ist kleiner als 0.

[noexcept, since 6.7] void QProcess::failChildProcessModifier(const char *description, int error = 0)

Diese Funktionen können innerhalb des Modifizierungssatzes mit setChildProcessModifier() verwendet werden, um anzuzeigen, dass eine Fehlerbedingung aufgetreten ist. Wenn der Modifikator diese Funktionen aufruft, sendet QProcess errorOccurred () mit dem Code QProcess::FailedToStart an den übergeordneten Prozess. description kann verwendet werden, um einige Informationen in errorString() aufzunehmen, die bei der Diagnose des Problems helfen, normalerweise den Namen des fehlgeschlagenen Aufrufs, ähnlich wie bei der C Library-Funktion perror(). Zusätzlich kann der Parameter error ein <errno.h> Fehlercode sein, dessen Textform ebenfalls aufgenommen wird.

Zum Beispiel könnte ein Child-Modifikator auf diese Weise einen zusätzlichen Dateideskriptor für den Child-Prozess vorbereiten:

process.setChildProcessModifier([fd, &process]() {
    if (dup2(fd, TargetFileDescriptor) < 0)
        process.failChildProcessModifier(errno, "aux comm channel");
});
process.start();

Wobei fd ein aktuell im Elternprozess geöffneter Dateideskriptor ist. Wenn der Systemaufruf dup2() zu einer EBADF Bedingung führte, könnte der Prozess errorString() lauten: "Child process modifier reported error: aux comm channel: Schlechter Dateideskriptor".

Diese Funktion kehrt nicht zum Aufrufer zurück. Die Verwendung dieser Funktion an einem anderen Ort als im Child-Modifier und mit dem korrekten QProcess Objekt ist undefiniertes Verhalten.

Hinweis: Die Implementierung begrenzt die Länge des Parameters description auf etwa 500 Zeichen. Dies beinhaltet nicht den Text aus dem error Code.

Diese Funktion wurde in Qt 6.7 eingeführt.

Siehe auch setChildProcessModifier() und setUnixProcessParameters().

[signal] void QProcess::finished(int exitCode, QProcess::ExitStatus exitStatus = NormalExit)

Dieses Signal wird ausgegeben, wenn der Prozess beendet wird. exitCode ist der Exit-Code des Prozesses (nur gültig für normale Exits), und exitStatus ist der Exit-Status. Nachdem der Prozess beendet wurde, sind die Puffer in QProcess noch intakt. Sie können immer noch alle Daten lesen, die der Prozess geschrieben hat, bevor er beendet wurde.

Siehe auch exitStatus().

QProcess::InputChannelMode QProcess::inputChannelMode() const

Gibt den Kanalmodus des Standard-Eingabekanals QProcess zurück.

Siehe auch setInputChannelMode() und InputChannelMode.

[override virtual] bool QProcess::isSequential() const

Reimplements: QIODevice::isSequential() const.

[slot] void QProcess::kill()

Beendet den aktuellen Prozess, wodurch er sofort beendet wird.

Unter Windows verwendet kill() TerminateProcess, unter Unix und macOS wird das Signal SIGKILL an den Prozess gesendet.

Siehe auch terminate().

QString QProcess::nativeArguments() const

Gibt die zusätzlichen nativen Befehlszeilenargumente für das Programm zurück.

Hinweis: Diese Funktion ist nur auf der Windows-Plattform verfügbar.

Siehe auch setNativeArguments().

[static] QString QProcess::nullDevice()

Das Null-Gerät des Betriebssystems.

Der zurückgegebene Dateipfad verwendet native Verzeichnistrennzeichen.

Siehe auch QProcess::setStandardInputFile(), QProcess::setStandardOutputFile(), und QProcess::setStandardErrorFile().

[override virtual] bool QProcess::open(QIODeviceBase::OpenMode mode = ReadWrite)

Reimplements: QIODevice::open(QIODeviceBase::OpenMode-Modus).

Startet das mit setProgram() eingestellte Programm mit den mit setArguments() eingestellten Argumenten. Der OpenMode wird auf mode gesetzt.

Diese Methode ist ein Alias für start() und existiert nur, um die durch QIODevice definierte Schnittstelle vollständig zu implementieren.

Gibt true zurück, wenn das Programm gestartet wurde.

Siehe auch start(), setProgram(), und setArguments().

QProcess::ProcessChannelMode QProcess::processChannelMode() const

Gibt den Kanalmodus der Standardausgabe- und Standardfehlerkanäle von QProcess zurück.

Siehe auch setProcessChannelMode(), ProcessChannelMode, und setReadChannel().

QProcessEnvironment QProcess::processEnvironment() const

Gibt die Umgebung zurück, die QProcess an seinen Kindprozess weitergeben wird. Wenn keine Umgebung mit setProcessEnvironment() gesetzt wurde, gibt diese Methode ein Objekt zurück, das anzeigt, dass die Umgebung vom Elternprozess geerbt wird.

Siehe auch setProcessEnvironment(), QProcessEnvironment::inheritsFromParent(), und Environment variables.

qint64 QProcess::processId() const

Gibt die systemeigene Prozesskennung für den laufenden Prozess zurück, sofern verfügbar. Wenn derzeit kein Prozess läuft, wird 0 zurückgegeben.

QString QProcess::program() const

Gibt das Programm zurück, mit dem der Prozess zuletzt gestartet wurde.

Siehe auch setProgram() und start().

QByteArray QProcess::readAllStandardError()

Unabhängig vom aktuellen Lesekanal gibt diese Funktion alle verfügbaren Daten aus dem Standardfehler des Prozesses als QByteArray zurück.

Siehe auch readyReadStandardError(), readAllStandardOutput(), readChannel(), und setReadChannel().

QByteArray QProcess::readAllStandardOutput()

Unabhängig vom aktuellen Lesekanal gibt diese Funktion alle verfügbaren Daten von der Standardausgabe des Prozesses als QByteArray zurück.

Siehe auch readyReadStandardOutput(), readAllStandardError(), readChannel(), und setReadChannel().

QProcess::ProcessChannel QProcess::readChannel() const

Gibt den aktuellen Lesekanal des QProcess zurück.

Siehe auch setReadChannel().

[override virtual protected] qint64 QProcess::readData(char *data, qint64 maxlen)

Reimplements: QIODevice::readData(char *data, qint64 maxSize).

[private signal] void QProcess::readyReadStandardError()

Dieses Signal wird ausgegeben, wenn der Prozess neue Daten über seinen Standard-Fehlerkanal (stderr) zur Verfügung gestellt hat. Es wird unabhängig von der aktuellen read channel ausgegeben.

Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, kann aber nicht vom Benutzer ausgegeben werden.

Siehe auch readAllStandardError() und readChannel().

[private signal] void QProcess::readyReadStandardOutput()

Dieses Signal wird ausgegeben, wenn der Prozess neue Daten über seinen Standardausgabekanal (stdout) zur Verfügung gestellt hat. Es wird unabhängig von der aktuellen read channel ausgegeben.

Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, aber nicht vom Benutzer ausgegeben werden.

Siehe auch readAllStandardOutput() und readChannel().

void QProcess::setArguments(const QStringList &arguments)

Legt die arguments fest, die beim Starten des Prozesses an das aufgerufene Programm übergeben wird. Diese Funktion muss vor start() aufgerufen werden.

Siehe auch start(), setProgram(), und arguments().

[since 6.0] void QProcess::setChildProcessModifier(const std::function<void ()> &modifier)

Setzt die Funktion modifier für den Kindprozess, für Unix-Systeme (einschließlich macOS; für Windows, siehe setCreateProcessArgumentsModifier()). Die im Argument modifier enthaltene Funktion wird im Kindprozess aufgerufen, nachdem fork() oder vfork() abgeschlossen ist und QProcess die Standard-Dateideskriptoren für den Kindprozess eingerichtet hat, jedoch vor execve(), innerhalb von start().

Das folgende Beispiel zeigt, wie ein Kindprozess so eingerichtet wird, dass er ohne Privilegien läuft:

void runSandboxed(const QString &name, const QStringList &arguments)
{
    QProcess proc;
    proc.setChildProcessModifier([] {
        // Drop all privileges in the child process, and enter
        // a chroot jail.
        ::setgroups(0, nullptr);
        ::chroot("/run/safedir");
        ::chdir("/");
        ::setgid(safeGid);
        ::setuid(safeUid);
        ::umask(077);
    });
    proc.start(name, arguments);
    proc.waitForFinished();
}

Wenn die Modifizierungsfunktion eine Fehlerbedingung erfährt, kann sie failChildProcessModifier() verwenden, um die Situation an den QProcess Aufrufer zu melden. Alternativ kann sie auch andere Methoden zum Anhalten des Prozesses verwenden, wie _exit() oder abort().

Bestimmte Eigenschaften des Kindprozesses, wie z. B. das Schließen aller fremden Dateideskriptoren oder das Trennen der Verbindung zum steuernden TTY, lassen sich leichter durch die Verwendung von setUnixProcessParameters() erreichen, das einen Fehler erkennen und einen FailedToStart Zustand melden kann. Der Modifikator ist nützlich, um bestimmte ungewöhnliche Eigenschaften des Kindprozesses zu ändern, wie z.B. zusätzliche Dateideskriptoren einzurichten. Wenn sowohl ein Kindprozess-Modifikator als auch Unix-Prozessparameter gesetzt sind, wird der Modifikator ausgeführt, bevor diese Parameter angewendet werden.

Hinweis: In Multithread-Anwendungen muss diese Funktion darauf achten, dass sie keine Funktionen aufruft, die Mutexe sperren, die möglicherweise in anderen Threads verwendet wurden (im Allgemeinen wird empfohlen, nur Funktionen zu verwenden, die von POSIX als "async-signal-safe" definiert sind). Der größte Teil der Qt API ist innerhalb dieses Callbacks unsicher, einschließlich qDebug(), und kann zu Deadlocks führen.

Hinweis: Wenn das UnixProcessParameters::UseVFork-Flag über setUnixProcessParameters() gesetzt ist, kann QProcess die Semantik von vfork() verwenden, um den Kindprozess zu starten, so dass diese Funktion noch strengere Einschränkungen befolgen muss. Erstens darf sie, da sie sich den Speicher immer noch mit dem Elternprozess teilt, nicht in nicht-lokale Variablen schreiben und muss beim Lesen aus diesen Variablen die richtige Ordnungssemantik einhalten, um Datenrennen zu vermeiden. Zweitens können sich noch mehr Bibliotheksfunktionen daneben benehmen; daher sollte diese Funktion nur Low-Level-Systemaufrufe verwenden, wie read(), write(), setsid(), nice(), und ähnliche.

Diese Funktion wurde in Qt 6.0 eingeführt.

Siehe auch childProcessModifier(), failChildProcessModifier(), und setUnixProcessParameters().

void QProcess::setCreateProcessArgumentsModifier(QProcess::CreateProcessArgumentModifier modifier)

Setzt die modifier für den Win32-API-Aufruf CreateProcess. Übergeben Sie QProcess::CreateProcessArgumentModifier(), um einen zuvor gesetzten Wert zu entfernen.

Hinweis: Diese Funktion ist nur auf der Windows-Plattform verfügbar und erfordert C++11.

Siehe auch createProcessArgumentsModifier(), QProcess::CreateProcessArgumentModifier, und setChildProcessModifier().

void QProcess::setInputChannelMode(QProcess::InputChannelMode mode)

Setzt den Kanalmodus des Standard-Eingabekanals QProcess auf den angegebenen mode. Dieser Modus wird verwendet, wenn start() das nächste Mal aufgerufen wird.

Siehe auch inputChannelMode() und InputChannelMode.

void QProcess::setNativeArguments(const QString &arguments)

Dies ist eine überladene Funktion.

Setzt zusätzliche native Befehlszeilen arguments für das Programm.

Auf Betriebssystemen, bei denen die System-API für die Übergabe von Befehlszeilen arguments an einen Unterprozess nativ eine einzelne Zeichenkette verwendet, kann man sich Befehlszeilen vorstellen, die nicht über QProcess's portable listenbasierte API übergeben werden können. In solchen Fällen muss diese Funktion verwendet werden, um eine Zeichenkette zu setzen, die an die aus der üblichen Argumentliste zusammengesetzte Zeichenkette angehängt wird, wobei ein Leerzeichen als Begrenzung dient.

Hinweis: Diese Funktion ist nur auf der Windows-Plattform verfügbar.

Siehe auch nativeArguments().

void QProcess::setProcessChannelMode(QProcess::ProcessChannelMode mode)

Setzt den Kanalmodus der Standardausgabe- und Standardfehlerkanäle von QProcess auf den angegebenen mode. Dieser Modus wird verwendet, wenn start() das nächste Mal aufgerufen wird. Zum Beispiel:

QProcess builder; builder.setProcessChannelMode(QProcess::MergedChannels); builder.start("make", QStringList()<< "-j2");if (!builder.waitForFinished())    qDebug() << "Make failed:" << builder.errorString();
sonst    qDebug() << "Make output:" << builder.readAll();

Siehe auch processChannelMode(), ProcessChannelMode, und setReadChannel().

void QProcess::setProcessEnvironment(const QProcessEnvironment &environment)

Legt die environment fest, die QProcess an den Kindprozess weitergibt.

Der folgende Code fügt zum Beispiel die Umgebungsvariable TMPDIR hinzu:

QProcess process;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("TMPDIR", "C:\\MyApp\\temp"); // Add an environment variable
process.setProcessEnvironment(env);
process.start("myapp");

Beachten Sie, dass unter Windows die Groß- und Kleinschreibung bei der Benennung von Umgebungsvariablen nicht beachtet wird.

Siehe auch processEnvironment(), QProcessEnvironment::systemEnvironment(), und Environment variables.

[protected] void QProcess::setProcessState(QProcess::ProcessState state)

Setzt den aktuellen Zustand von QProcess auf den angegebenen state.

Siehe auch state().

void QProcess::setProgram(const QString &program)

Legt die program fest, die beim Starten des Prozesses verwendet werden soll. Diese Funktion muss vor start() aufgerufen werden.

Wenn program ein absoluter Pfad ist, gibt er die genaue ausführbare Datei an, die gestartet wird. Relative Pfade werden auf plattformspezifische Weise aufgelöst, einschließlich der Suche in der Umgebungsvariablen PATH (siehe Finding the Executable für Details).

Siehe auch start(), setArguments(), program(), und QStandardPaths::findExecutable().

void QProcess::setReadChannel(QProcess::ProcessChannel channel)

Setzt den aktuellen Lesekanal von QProcess auf den angegebenen channel. Der aktuelle Eingangskanal wird von den Funktionen read(), readAll(), readLine() und getChar() verwendet. Er bestimmt auch, welcher Kanal QProcess zur Ausgabe von readyRead() veranlasst.

Siehe auch readChannel().

void QProcess::setStandardErrorFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate)

Leitet den Standardfehler des Prozesses an die Datei fileName um. Wenn die Umleitung eingerichtet ist, wird der Standardfehler-Lesekanal geschlossen: Das Lesen aus der Datei mit read() wird immer fehlschlagen, ebenso wie readAllStandardError(). Die Datei wird angehängt, wenn mode Append ist, andernfalls wird sie abgeschnitten.

Siehe setStandardOutputFile() für weitere Informationen zum Öffnen der Datei.

Hinweis: Wenn setProcessChannelMode() mit dem Argument QProcess::MergedChannels aufgerufen wurde, hat diese Funktion keine Wirkung.

Siehe auch setStandardInputFile(), setStandardOutputFile(), und setStandardOutputProcess().

void QProcess::setStandardInputFile(const QString &fileName)

Leitet die Standardeingabe des Prozesses zu der durch fileName angegebenen Datei um. Wenn eine Eingabeumleitung vorhanden ist, befindet sich das Objekt QProcess im Nur-Lese-Modus (der Aufruf von write() führt zu einem Fehler).

Um den Prozess zu veranlassen, EOF sofort zu lesen, übergeben Sie hier nullDevice(). Dies ist sauberer als die Verwendung von closeWriteChannel() vor dem Schreiben von Daten, da es vor dem Start des Prozesses eingerichtet werden kann.

Wenn die Datei fileName zum Zeitpunkt des Aufrufs von start() nicht existiert oder nicht lesbar ist, schlägt das Starten des Prozesses fehl.

Der Aufruf von setStandardInputFile() nach dem Start des Prozesses hat keine Auswirkungen.

Siehe auch setStandardOutputFile(), setStandardErrorFile(), und setStandardOutputProcess().

void QProcess::setStandardOutputFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate)

Leitet die Standardausgabe des Prozesses in die Datei fileName um. Wenn die Umleitung eingerichtet ist, ist der Lesekanal für die Standardausgabe geschlossen: das Lesen mit read() wird immer fehlschlagen, ebenso wie readAllStandardOutput().

Um alle Standardausgaben des Prozesses zu verwerfen, übergeben Sie hier nullDevice(). Dies ist effizienter, als die Standardausgabe einfach nie zu lesen, da keine QProcess Puffer gefüllt werden.

Wenn die Datei fileName zum Zeitpunkt des Aufrufs von start() noch nicht existiert, wird sie erstellt. Wenn sie nicht erstellt werden kann, schlägt der Start fehl.

Wenn die Datei existiert und mode gleich QIODeviceBase::Truncate ist, wird die Datei abgeschnitten. Andernfalls (wenn mode gleich QIODeviceBase::Append ist), wird die Datei angehängt.

Der Aufruf von setStandardOutputFile() nach dem Start des Prozesses hat keine Auswirkungen.

Wenn fileName eine leere Zeichenkette ist, wird die Umleitung der Standardausgabe beendet. Dies ist nützlich, um die Standardausgabe nach einer Umleitung wiederherzustellen.

Siehe auch setStandardInputFile(), setStandardErrorFile(), und setStandardOutputProcess().

void QProcess::setStandardOutputProcess(QProcess *destination)

Leitet den Standardausgabestrom dieses Prozesses an die Standardeingabe des Prozesses destination weiter.

Der folgende Shell-Befehl:

command1 | command2

Kann mit QProcess mit folgendem Code ausgeführt werden:

QProcess process1;
QProcess process2;

process1.setStandardOutputProcess(&process2);

process1.start("command1");
process2.start("command2");

[since 6.6] void QProcess::setUnixProcessParameters(const QProcess::UnixProcessParameters &params)

Setzt die zusätzlichen Einstellungen und Parameter für den Kindprozess auf Unix-Systemen auf params. Diese Funktion kann verwendet werden, um QProcess aufzufordern, den Kindprozess zu ändern, bevor das ausführbare Zielprogramm gestartet wird.

Diese Funktion kann verwendet werden, um bestimmte Eigenschaften des Kindprozesses zu ändern, wie z.B. das Schließen aller fremden Dateideskriptoren, das Ändern des Nice-Levels des Kindprozesses oder das Trennen der Verbindung mit dem steuernden TTY. Für eine feinere Kontrolle des Kindprozesses oder um ihn auf andere Weise zu verändern, verwenden Sie die Funktion setChildProcessModifier(). Wenn sowohl ein Kindprozessmodifikator als auch Unix-Prozessparameter gesetzt sind, wird der Modifikator ausgeführt, bevor diese Parameter angewendet werden.

Hinweis: Diese Funktion ist nur auf Unix-Plattformen verfügbar.

Diese Funktion wurde in Qt 6.6 eingeführt.

Siehe auch unixProcessParameters() und setChildProcessModifier().

[since 6.6] void QProcess::setUnixProcessParameters(QProcess::UnixProcessFlags flagsOnly)

Dies ist eine überladene Funktion.

Setzt die zusätzlichen Einstellungen für den Kindprozess auf Unix-Systemen auf flagsOnly. Dies ist dasselbe wie die Überladung, bei der nur das Feld flags gesetzt ist.

Hinweis: Diese Funktion ist nur auf Unix-Plattformen verfügbar.

Diese Funktion wurde in Qt 6.6 eingeführt.

Siehe auch unixProcessParameters() und setChildProcessModifier().

void QProcess::setWorkingDirectory(const QString &dir)

Setzt das Arbeitsverzeichnis auf dir. QProcess startet den Prozess in diesem Verzeichnis. Das Standardverhalten ist, den Prozess im Arbeitsverzeichnis des aufrufenden Prozesses zu starten.

Siehe auch workingDirectory() und start().

[static] QStringList QProcess::splitCommand(QStringView command)

Zerlegt die Zeichenkette command in eine Liste von Token und gibt die Liste zurück.

Zeichen mit Leerzeichen können von doppelten Anführungszeichen umgeben sein; drei aufeinanderfolgende doppelte Anführungszeichen stellen das Anführungszeichen selbst dar.

void QProcess::start(const QString &program, const QStringList &arguments = {}, QIODeviceBase::OpenMode mode = ReadWrite)

Startet die angegebene program in einem neuen Prozess und übergibt die Befehlszeilenargumente in arguments. Siehe setProgram() für Informationen darüber, wie QProcess nach der auszuführenden Datei sucht. Der OpenMode wird auf mode gesetzt. Es wird keine weitere Aufteilung der Argumente vorgenommen.

Das Objekt QProcess geht sofort in den Zustand Starting über. Wenn der Prozess erfolgreich startet, gibt QProcess started () aus; andernfalls wird errorOccurred() ausgegeben. Beachten Sie, dass auf Plattformen, die in der Lage sind, Kindprozesse synchron zu starten (insbesondere Windows), diese Signale ausgegeben werden, bevor diese Funktion zurückkehrt, und dieses QProcess Objekt entweder in den Zustand QProcess::Running oder QProcess::NotRunning übergeht. Auf anderen Plattformen werden die Signale started() und errorOccurred() verzögert ausgegeben.

Rufen Sie waitForStarted() auf, um sicherzustellen, dass der Prozess gestartet wurde (oder nicht gestartet werden konnte) und diese Signale ausgegeben wurden. Es ist sicher, diese Funktion auch dann aufzurufen, wenn der Startzustand des Prozesses bereits bekannt ist, obwohl das Signal nicht erneut ausgegeben wird.

Fenster: Die Argumente werden in Anführungszeichen gesetzt und zu einer Befehlszeile verbunden, die mit der Windows-Funktion CommandLineToArgvW() kompatibel ist. Für Programme, die andere Anforderungen an die Anführungszeichen in der Befehlszeile haben, müssen Sie setNativeArguments() verwenden. Ein bemerkenswertes Programm, das sich nicht an die Regeln von CommandLineToArgvW() hält, ist cmd.exe und folglich auch alle Batch-Skripte.

Wenn das Objekt QProcess bereits einen Prozess ausführt, wird möglicherweise eine Warnung auf der Konsole ausgegeben, und der bestehende Prozess läuft unbeeinflusst weiter.

Hinweis: Ein erfolgreicher Start des Kindprozesses bedeutet nur, dass das Betriebssystem den Prozess erfolgreich erstellt und die Ressourcen zugewiesen hat, die jeder Prozess hat, wie z. B. seine Prozess-ID. Der Kindprozess kann abstürzen oder anderweitig sehr früh scheitern und somit nicht die erwartete Ausgabe produzieren. Auf den meisten Betriebssystemen kann dies dynamische Verknüpfungsfehler einschließen.

Siehe auch processId(), started(), waitForStarted(), und setNativeArguments().

void QProcess::start(QIODeviceBase::OpenMode mode = ReadWrite)

Dies ist eine überladene Funktion.

Startet das mit setProgram() eingestellte Programm mit den mit setArguments() eingestellten Argumenten. Der OpenMode wird auf mode gesetzt.

Siehe auch open(), setProgram(), und setArguments().

[since 6.0] void QProcess::startCommand(const QString &command, QIODeviceBase::OpenMode mode = ReadWrite)

Startet den Befehl command in einem neuen Prozess. Der OpenMode ist auf mode eingestellt.

command ist eine einzelne Textzeichenfolge, die sowohl den Programmnamen als auch die Argumente enthält. Die Argumente werden durch ein oder mehrere Leerzeichen getrennt. Ein Beispiel:

QProcess process;
process.startCommand("del /s *.txt");
// same as process.start("del", QStringList() << "/s" << "*.txt");
...

Argumente, die Leerzeichen enthalten, müssen in Anführungszeichen gesetzt werden, damit sie korrekt an den neuen Prozess übergeben werden. Ein Beispiel:

QProcess process;
process.startCommand("dir \"My Documents\"");

Wörtliche Anführungszeichen in der Zeichenfolge command werden durch dreifache Anführungszeichen dargestellt. Ein Beispiel:

QProcess process;
process.startCommand("dir \"Epic 12\"\"\" Singles\"");

Nachdem die Zeichenfolge command geteilt und aus den Anführungszeichen entfernt wurde, verhält sich diese Funktion wie start().

Auf Betriebssystemen, bei denen die System-API für die Übergabe von Befehlszeilenargumenten an einen Unterprozess von Haus aus eine einzelne Zeichenkette verwendet (Windows), kann es vorkommen, dass Befehlszeilen nicht über die portable listenbasierte API von QProcess übergeben werden können. In diesen seltenen Fällen müssen Sie setProgram() und setNativeArguments() anstelle dieser Funktion verwenden.

Diese Funktion wurde in Qt 6.0 eingeführt.

Siehe auch splitCommand() und start().

bool QProcess::startDetached(qint64 *pid = nullptr)

Startet das mit setProgram() eingestellte Programm mit den mit setArguments() eingestellten Argumenten in einem neuen Prozess und trennt sich von diesem. Gibt bei Erfolg true zurück, andernfalls false. Wenn der aufrufende Prozess beendet wird, läuft der abgelöste Prozess unbeeinflusst weiter.

Unix: Der gestartete Prozess wird in seiner eigenen Sitzung ausgeführt und verhält sich wie ein Daemon.

Der Prozess wird in dem Verzeichnis gestartet, das durch setWorkingDirectory() festgelegt wurde. Wenn workingDirectory() leer ist, wird das Arbeitsverzeichnis vom aufrufenden Prozess geerbt.

Wenn die Funktion erfolgreich ist, wird *pid auf die Prozesskennung des gestarteten Prozesses gesetzt; andernfalls wird sie auf -1 gesetzt. Beachten Sie, dass der Kindprozess beendet werden kann und die PID ohne Vorankündigung ungültig werden kann. Außerdem kann nach dem Beenden des Kindprozesses dieselbe PID wiederverwendet und von einem völlig anderen Prozess verwendet werden. Benutzercode sollte bei der Verwendung dieser Variablen vorsichtig sein, insbesondere wenn man beabsichtigt, den Prozess mit Betriebssystemmitteln zu beenden.

Nur die folgenden Property Setter werden von startDetached() unterstützt:

Alle anderen Eigenschaften des QProcess Objekts werden ignoriert.

Hinweis: Der aufgerufene Prozess erbt das Konsolenfenster des aufrufenden Prozesses. Um die Konsolenausgabe zu unterdrücken, leiten Sie die Standard-/Fehlerausgabe an QProcess::nullDevice() um.

Siehe auch start() und startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory, qint64 *pid).

[static] bool QProcess::startDetached(const QString &program, const QStringList &arguments = {}, const QString &workingDirectory = QString(), qint64 *pid = nullptr)

Diese Funktion überlastet startDetached().

Startet das Programm program mit den Argumenten arguments in einem neuen Prozess und trennt sich von ihm. Gibt bei Erfolg true zurück, andernfalls false. Wenn der aufrufende Prozess beendet wird, läuft der abgetrennte Prozess unbeeinflusst weiter.

Die Argumentbehandlung ist identisch mit der entsprechenden start() Überladung.

Der Prozess wird in dem Verzeichnis workingDirectory gestartet. Wenn workingDirectory leer ist, wird das Arbeitsverzeichnis vom aufrufenden Prozess geerbt.

Wenn die Funktion erfolgreich ist, wird *pid auf die Prozesskennung des gestarteten Prozesses gesetzt.

Siehe auch start().

[private signal] void QProcess::started()

Dieses Signal wird von QProcess ausgegeben, wenn der Prozess gestartet ist, und state() gibt Running zurück.

Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, aber nicht vom Benutzer ausgegeben werden.

QProcess::ProcessState QProcess::state() const

Gibt den aktuellen Status des Prozesses zurück.

Siehe auch stateChanged() und error().

[private signal] void QProcess::stateChanged(QProcess::ProcessState newState)

Dieses Signal wird ausgegeben, wenn sich der Zustand von QProcess ändert. Das Argument newState ist der Zustand, in den QProcess gewechselt hat.

Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, aber nicht vom Benutzer ausgegeben werden.

[static] QStringList QProcess::systemEnvironment()

Gibt die Umgebung des aufrufenden Prozesses als eine Liste von Schlüssel=Wert-Paaren zurück. Beispiel:

QStringList environment = QProcess::systemEnvironment();
// environment = {"PATH=/usr/bin:/usr/local/bin",
//                "USER=greg", "HOME=/home/greg"}

Diese Funktion speichert die Systemumgebung nicht im Cache. Daher ist es möglich, eine aktualisierte Version der Umgebung zu erhalten, wenn Low-Level-C-Bibliotheksfunktionen wie setenv oder putenv aufgerufen wurden.

Beachten Sie jedoch, dass bei wiederholten Aufrufen dieser Funktion die Liste der Umgebungsvariablen neu erstellt wird, was eine nicht triviale Operation ist.

Hinweis: Für neuen Code wird empfohlen, QProcessEnvironment::systemEnvironment() zu verwenden.

Siehe auch QProcessEnvironment::systemEnvironment() und setProcessEnvironment().

[slot] void QProcess::terminate()

Versucht, den Prozess zu beenden.

Der Prozess darf durch den Aufruf dieser Funktion nicht beendet werden (er erhält die Möglichkeit, den Benutzer nach ungespeicherten Dateien usw. zu fragen).

Unter Windows sendet terminate() eine WM_CLOSE-Nachricht an alle Top-Level-Fenster des Prozesses und dann an den Hauptthread des Prozesses selbst. Unter Unix und macOS wird das Signal SIGTERM gesendet.

Konsolenanwendungen unter Windows, die keine Ereignisschleife ausführen oder deren Ereignisschleife die WM_CLOSE-Nachricht nicht verarbeitet, können nur durch den Aufruf von kill() beendet werden.

Siehe auch kill().

[noexcept, since 6.6] QProcess::UnixProcessParameters QProcess::unixProcessParameters() const

Gibt das Objekt UnixProcessParameters zurück, das zusätzliche Flags und Einstellungen beschreibt, die auf Unix-Systemen auf den Kindprozess angewendet werden. Die Standardeinstellungen entsprechen einem standardmäßig konstruierten UnixProcessParameters.

Hinweis: Diese Funktion ist nur auf Unix-Plattformen verfügbar.

Diese Funktion wurde in Qt 6.6 eingeführt.

Siehe auch setUnixProcessParameters() und childProcessModifier().

[override virtual] bool QProcess::waitForBytesWritten(int msecs = 30000)

Reimplements: QIODevice::waitForBytesWritten(int msecs).

bool QProcess::waitForFinished(int msecs = 30000)

Blockiert, bis der Prozess beendet ist und das Signal finished() ausgegeben wurde, oder bis msecs Millisekunden vergangen sind.

Gibt true zurück, wenn der Prozess beendet wurde; andernfalls wird false zurückgegeben (wenn der Vorgang eine Zeitüberschreitung hatte, ein Fehler auftrat oder dieser QProcess bereits beendet ist).

Diese Funktion kann ohne eine Ereignisschleife arbeiten. Sie ist nützlich beim Schreiben von Nicht-GUI-Anwendungen und bei der Durchführung von E/A-Operationen in einem Nicht-GUI-Thread.

Warnung: Der Aufruf dieser Funktion aus dem Haupt-Thread (GUI-Thread) kann dazu führen, dass Ihre Benutzeroberfläche einfriert.

Wenn msecs -1 ist, wird diese Funktion nicht abgebrochen.

Siehe auch finished(), waitForStarted(), waitForReadyRead(), und waitForBytesWritten().

[override virtual] bool QProcess::waitForReadyRead(int msecs = 30000)

Reimplements: QIODevice::waitForReadyRead(int msecs).

bool QProcess::waitForStarted(int msecs = 30000)

Blockiert, bis der Prozess gestartet wurde und das Signal started() ausgegeben wurde oder bis msecs Millisekunden vergangen sind.

Gibt true zurück, wenn der Prozess erfolgreich gestartet wurde; andernfalls wird false zurückgegeben (wenn der Vorgang eine Zeitüberschreitung hatte oder ein Fehler auftrat). Wenn der Prozess bereits vor dieser Funktion erfolgreich gestartet wurde, kehrt sie sofort zurück.

Diese Funktion kann ohne eine Ereignisschleife arbeiten. Sie ist nützlich beim Schreiben von Nicht-GUI-Anwendungen und bei der Durchführung von E/A-Operationen in einem Nicht-GUI-Thread.

Warnung: Der Aufruf dieser Funktion aus dem Haupt-Thread (GUI-Thread) kann zum Einfrieren der Benutzeroberfläche führen.

Wenn msecs -1 ist, wird diese Funktion nicht abgebrochen.

Siehe auch started(), waitForReadyRead(), waitForBytesWritten(), und waitForFinished().

QString QProcess::workingDirectory() const

Wenn QProcess ein Arbeitsverzeichnis zugewiesen wurde, gibt diese Funktion das Arbeitsverzeichnis zurück, in das QProcess vor dem Programmstart wechselt. Andernfalls (d.h. wenn kein Verzeichnis zugewiesen wurde) wird eine leere Zeichenkette zurückgegeben, und QProcess verwendet stattdessen das aktuelle Arbeitsverzeichnis der Anwendung.

Siehe auch setWorkingDirectory().

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.