diff options
author | hjk <hjk@qt.io> | 2021-05-14 15:21:54 +0200 |
---|---|---|
committer | hjk <hjk@qt.io> | 2021-06-02 13:21:08 +0000 |
commit | 08040e4e94acba0c781b058ac5408955a4bc95fb (patch) | |
tree | d4ea954f7a175ff784b7b7e78f1a6f490e522d14 | |
parent | 0f535703aa9f68e7654547ca93c118196ad2a0bd (diff) |
Utils: Move QProcess base to QtcProcessPrivate
Change-Id: I4c6811d42e051fadfcf32edb664ff3bc09e692e6
Reviewed-by: David Schulz <david.schulz@qt.io>
31 files changed, 399 insertions, 218 deletions
diff --git a/src/libs/utils/archive.cpp b/src/libs/utils/archive.cpp index de111dec837..cf1ce2e2b11 100644 --- a/src/libs/utils/archive.cpp +++ b/src/libs/utils/archive.cpp @@ -212,7 +212,7 @@ Archive *Archive::unarchive(const FilePath &src, const FilePath &dest) archive->m_process->setProcessChannelMode(QProcess::MergedChannels); QObject::connect( archive->m_process, - &QProcess::readyReadStandardOutput, + &QtcProcess::readyReadStandardOutput, archive, [archive]() { if (!archive->m_process) @@ -222,7 +222,7 @@ Archive *Archive::unarchive(const FilePath &src, const FilePath &dest) Qt::QueuedConnection); QObject::connect( archive->m_process, - QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), + &QtcProcess::finished, archive, [archive](int, QProcess::ExitStatus) { if (!archive->m_process) @@ -236,7 +236,7 @@ Archive *Archive::unarchive(const FilePath &src, const FilePath &dest) Qt::QueuedConnection); QObject::connect( archive->m_process, - &QProcess::errorOccurred, + &QtcProcess::errorOccurred, archive, [archive](QProcess::ProcessError) { if (!archive->m_process) @@ -248,22 +248,18 @@ Archive *Archive::unarchive(const FilePath &src, const FilePath &dest) archive->deleteLater(); }, Qt::QueuedConnection); + QTimer::singleShot(0, archive, [archive, tool, workingDirectory] { archive->outputReceived( tr("Running %1\nin \"%2\".\n\n", "Running <cmd> in <workingdirectory>") .arg(CommandLine(tool->executable, tool->arguments).toUserOutput(), workingDirectory)); }); - archive->m_process->setProgram(tool->executable); -#ifdef Q_OS_WIN - if (!tool->nativeWindowsArguments) - archive->m_process->setArguments(tool->arguments); - else if (!tool->arguments.isEmpty()) - archive->m_process->setNativeArguments(tool->arguments.at(0)); -#else - archive->m_process->setArguments(tool->arguments); -#endif + CommandLine cmd = tool->nativeWindowsArguments + ? CommandLine{FilePath::fromString(tool->executable), tool->arguments[0], CommandLine::Raw} + : CommandLine{tool->executable, tool->arguments}; + archive->m_process->setCommand(cmd); archive->m_process->setWorkingDirectory(workingDirectory); archive->m_process->setOpenMode(QProcess::ReadOnly); archive->m_process->start(); diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index f782f8823b2..2f101f8ccb8 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -82,7 +82,7 @@ public: void clearForRun(); QString linesRead(); - void append(const QByteArray &text, bool emitSignals); + void append(const QByteArray &text); QByteArray rawData; QString incompleteLineBuffer; // lines not yet signaled @@ -92,20 +92,88 @@ public: std::function<void(const QString &lines)> outputCallback; }; +class ProcessHelper : public QProcess +{ +public: + ProcessHelper() + { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) && defined(Q_OS_UNIX) + setChildProcessModifier([this] { d->setupChildProcess_impl(); }); +#endif + } + +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + void setupChildProcess() override { setupChildProcess_impl(); } +#endif + + void setupChildProcess_impl() + { +#if defined Q_OS_UNIX + // nice value range is -20 to +19 where -20 is highest, 0 default and +19 is lowest + if (m_lowPriority) { + errno = 0; + if (::nice(5) == -1 && errno != 0) + perror("Failed to set nice value"); + } + + // Disable terminal by becoming a session leader. + if (m_disableUnixTerminal) + setsid(); +#endif + } + + using QProcess::setErrorString; + + bool m_lowPriority = false; + bool m_disableUnixTerminal = false; +}; + class QtcProcessPrivate : public QObject { public: - explicit QtcProcessPrivate(QtcProcess *parent) : q(parent) {} + explicit QtcProcessPrivate(QtcProcess *parent) + : q(parent), m_process(new ProcessHelper) + { + connect(m_process, &QProcess::started, + q, &QtcProcess::started); + connect(m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), + q, &QtcProcess::finished); + connect(m_process, &QProcess::errorOccurred, + q, &QtcProcess::errorOccurred); + connect(m_process, &QProcess::stateChanged, + q, &QtcProcess::stateChanged); + connect(m_process, &QProcess::readyReadStandardOutput, + this, &QtcProcessPrivate::handleReadyReadStandardOutput); + connect(m_process, &QProcess::readyReadStandardError, + this, &QtcProcessPrivate::handleReadyReadStandardError); + } - void setupChildProcess_impl(); + ~QtcProcessPrivate() + { + delete m_process; + } + void handleReadyReadStandardOutput() + { + m_stdOut.append(m_process->readAllStandardOutput()); + m_hangTimerCount = 0; + emit q->readyReadStandardOutput(); + } + + void handleReadyReadStandardError() + { + m_stdErr.append(m_process->readAllStandardError()); + m_hangTimerCount = 0; + emit q->readyReadStandardOutput(); + } + + QtcProcess *q; + ProcessHelper *m_process; CommandLine m_commandLine; Environment m_environment; QByteArray m_writeData; bool m_haveEnv = false; bool m_useCtrlCStub = false; - bool m_lowPriority = false; - bool m_disableUnixTerminal = false; QProcess::OpenMode m_openMode = QProcess::ReadWrite; @@ -117,7 +185,6 @@ public: QtcProcess::Result interpretExitCode(int exitCode); - QtcProcess *q; QTextCodec *m_codec = QTextCodec::codecForLocale(); QTimer m_timer; QEventLoop m_eventLoop; @@ -170,16 +237,12 @@ QtcProcess::Result QtcProcessPrivate::interpretExitCode(int exitCode) */ QtcProcess::QtcProcess(QObject *parent) - : QProcess(parent), d(new QtcProcessPrivate(this)) + : QObject(parent), d(new QtcProcessPrivate(this)) { static int qProcessExitStatusMeta = qRegisterMetaType<QProcess::ExitStatus>(); static int qProcessProcessErrorMeta = qRegisterMetaType<QProcess::ProcessError>(); Q_UNUSED(qProcessExitStatusMeta) Q_UNUSED(qProcessProcessErrorMeta) - -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) && defined(Q_OS_UNIX) - setChildProcessModifier([this] { d->setupChildProcess_impl(); }); -#endif } QtcProcess::~QtcProcess() @@ -208,6 +271,16 @@ const CommandLine &QtcProcess::commandLine() const return d->m_commandLine; } +QString QtcProcess::workingDirectory() const +{ + return d->m_process->workingDirectory(); +} + +void QtcProcess::setWorkingDirectory(const QString &dir) +{ + d->m_process->setWorkingDirectory(dir); +} + void QtcProcess::setUseCtrlCStub(bool enabled) { // Do not use the stub in debug mode. Activating the stub will shut down @@ -244,7 +317,7 @@ void QtcProcess::start() qPrintable(d->m_commandLine.executable().toString())); env = d->m_environment; - QProcess::setProcessEnvironment(env.toProcessEnvironment()); + d->m_process->setProcessEnvironment(env.toProcessEnvironment()); } else { env = Environment::systemEnvironment(); } @@ -258,25 +331,26 @@ void QtcProcess::start() if (osType == OsTypeWindows) { QString args; if (d->m_useCtrlCStub) { - if (d->m_lowPriority) + if (d->m_process->m_lowPriority) ProcessArgs::addArg(&args, "-nice"); ProcessArgs::addArg(&args, QDir::toNativeSeparators(command)); command = QCoreApplication::applicationDirPath() + QLatin1String("/qtcreator_ctrlc_stub.exe"); - } else if (d->m_lowPriority) { + } else if (d->m_process->m_lowPriority) { #ifdef Q_OS_WIN - setCreateProcessArgumentsModifier([](CreateProcessArguments *args) { - args->flags |= BELOW_NORMAL_PRIORITY_CLASS; + d->m_process->setCreateProcessArgumentsModifier( + [](QProcess::CreateProcessArguments *args) { + args->flags |= BELOW_NORMAL_PRIORITY_CLASS; }); #endif } ProcessArgs::addArgs(&args, arguments.toWindowsArgs()); #ifdef Q_OS_WIN - setNativeArguments(args); + d->m_process->setNativeArguments(args); #endif // Note: Arguments set with setNativeArgs will be appended to the ones // passed with start() below. - QProcess::start(command, QStringList(), d->m_openMode); + d->m_process->start(command, QStringList(), d->m_openMode); } else { if (!success) { setErrorString(tr("Error in command line.")); @@ -285,7 +359,7 @@ void QtcProcess::start() emit errorOccurred(QProcess::UnknownError); return; } - QProcess::start(command, arguments.toUnixArgs(), d->m_openMode); + d->m_process->start(command, arguments.toUnixArgs(), d->m_openMode); } } @@ -321,7 +395,7 @@ void QtcProcess::terminate() EnumWindows(sendShutDownMessageToAllWindowsOfProcess_enumWnd, processId()); else #endif - QProcess::terminate(); + d->m_process->terminate(); } void QtcProcess::interrupt() @@ -334,12 +408,12 @@ void QtcProcess::interrupt() void QtcProcess::setLowPriority() { - d->m_lowPriority = true; + d->m_process->m_lowPriority = true; } void QtcProcess::setDisableUnixTerminal() { - d->m_disableUnixTerminal = true; + d->m_process->m_disableUnixTerminal = true; } void QtcProcess::setRemoteProcessHooks(const DeviceProcessHooks &hooks) @@ -347,30 +421,7 @@ void QtcProcess::setRemoteProcessHooks(const DeviceProcessHooks &hooks) s_deviceHooks = hooks; } -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) -void QtcProcess::setupChildProcess() -{ - d->setupChildProcess_impl(); -} -#endif - -void QtcProcessPrivate::setupChildProcess_impl() -{ -#if defined Q_OS_UNIX - // nice value range is -20 to +19 where -20 is highest, 0 default and +19 is lowest - if (m_lowPriority) { - errno = 0; - if (::nice(5) == -1 && errno != 0) - perror("Failed to set nice value"); - } - - // Disable terminal by becoming a session leader. - if (m_disableUnixTerminal) - setsid(); -#endif -} - -void QtcProcess::setOpenMode(OpenMode mode) +void QtcProcess::setOpenMode(QIODevice::OpenMode mode) { d->m_openMode = mode; } @@ -429,7 +480,7 @@ bool QtcProcess::readDataFromProcess(int timeoutS, return false; } - QTC_ASSERT(readChannel() == QProcess::StandardOutput, return false); + QTC_ASSERT(d->m_process->readChannel() == QProcess::StandardOutput, return false); // Keep the process running until it has no longer has data bool finished = false; @@ -438,15 +489,15 @@ bool QtcProcess::readDataFromProcess(int timeoutS, finished = waitForFinished(timeoutS > 0 ? timeoutS * 1000 : -1) || state() == QProcess::NotRunning; // First check 'stdout' - if (bytesAvailable()) { // applies to readChannel() only + if (d->m_process->bytesAvailable()) { // applies to readChannel() only hasData = true; - const QByteArray newStdOut = readAllStandardOutput(); + const QByteArray newStdOut = d->m_process->readAllStandardOutput(); if (stdOut) stdOut->append(newStdOut); } // Check 'stderr' separately. This is a special handling // for 'git pull' and the like which prints its progress on stderr. - const QByteArray newStdErr = readAllStandardError(); + const QByteArray newStdErr = d->m_process->readAllStandardError(); if (!newStdErr.isEmpty()) { hasData = true; if (stdErr) @@ -454,7 +505,7 @@ bool QtcProcess::readDataFromProcess(int timeoutS, } // Prompt user, pretend we have data if says 'No'. const bool hang = !hasData && !finished; - hasData = hang && showTimeOutMessageBox && !askToKill(program()); + hasData = hang && showTimeOutMessageBox && !askToKill(d->m_process->program()); } while (hasData && !finished); if (syncDebug) qDebug() << "<readDataFromProcess" << finished; @@ -484,7 +535,7 @@ void QtcProcess::setResult(Result result) int QtcProcess::exitCode() const { - return d->m_isSynchronousProcess ? d->m_exitCode : QProcess::exitCode(); // FIXME: Unify. + return d->m_isSynchronousProcess ? d->m_exitCode : d->m_process->exitCode(); // FIXME: Unify. } @@ -577,6 +628,115 @@ Environment QtcProcess::systemEnvironmentForBinary(const FilePath &filePath) return Environment::systemEnvironment(); } +void QtcProcess::setProcessChannelMode(QProcess::ProcessChannelMode mode) +{ + d->m_process->setProcessChannelMode(mode); +} + +QProcess::ProcessError QtcProcess::error() const +{ + return d->m_process->error(); +} + +QProcess::ProcessState QtcProcess::state() const +{ + return d->m_process->state(); +} + +QString QtcProcess::errorString() const +{ + return d->m_process->errorString(); +} + +void QtcProcess::setErrorString(const QString &str) +{ + d->m_process->setErrorString(str); +} + +qint64 QtcProcess::processId() const +{ + return d->m_process->processId(); +} + +bool QtcProcess::waitForStarted(int msecs) +{ + return d->m_process->waitForStarted(msecs); +} + +bool QtcProcess::waitForReadyRead(int msecs) +{ + return d->m_process->waitForReadyRead(msecs); +} + +bool QtcProcess::waitForFinished(int msecs) +{ + return d->m_process->waitForFinished(msecs); +} + +QByteArray QtcProcess::readAllStandardOutput() +{ + QByteArray buf = d->m_stdOut.rawData; + d->m_stdOut.rawData.clear(); + return buf; +} + +QByteArray QtcProcess::readAllStandardError() +{ + QByteArray buf = d->m_stdErr.rawData; + d->m_stdErr.rawData.clear(); + return buf; +} + +QByteArray QtcProcess::readAll() +{ + return d->m_process->readAll(); +} + +QByteArray QtcProcess::readLine() +{ + return d->m_process->readLine(); +} + +QProcess::ExitStatus QtcProcess::exitStatus() const +{ + return d->m_process->exitStatus(); +} + +void QtcProcess::kill() +{ + d->m_process->kill(); +} + +qint64 QtcProcess::write(const QByteArray &input) +{ + return d->m_process->write(input); +} + +void QtcProcess::closeWriteChannel() +{ + d->m_process->closeWriteChannel(); +} + +void QtcProcess::close() +{ + d->m_process->close(); +} + +void QtcProcess::setReadChannel(QProcess::ProcessChannel channel) +{ + d->m_process->setReadChannel(channel); +} + +bool QtcProcess::canReadLine() const +{ + return d->m_process->canReadLine(); +} + +bool QtcProcess::atEnd() const +{ + return d->m_process->atEnd(); +} + QString QtcProcess::locateBinary(const QString &binary) { const QByteArray path = qgetenv("PATH"); @@ -631,6 +791,11 @@ QString QtcProcess::exitMessage() return QString(); } +QIODevice *QtcProcess::ioDevice() +{ + return d->m_process; +} + QByteArray QtcProcess::allRawOutput() const { if (!d->m_stdOut.rawData.isEmpty() && !d->m_stdErr.rawData.isEmpty()) { @@ -718,13 +883,11 @@ QString ChannelBuffer::linesRead() return lines; } -void ChannelBuffer::append(const QByteArray &text, bool emitSignals) +void ChannelBuffer::append(const QByteArray &text) { if (text.isEmpty()) return; rawData += text; - if (!emitSignals) - return; // Buffered. Emit complete lines? if (outputCallback) { @@ -742,17 +905,9 @@ SynchronousProcess::SynchronousProcess() d->m_timer.setInterval(1000); connect(&d->m_timer, &QTimer::timeout, d, &QtcProcessPrivate::slotTimeout); - connect(this, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), + connect(d->m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), d, &QtcProcessPrivate::slotFinished); - connect(this, &QProcess::errorOccurred, d, &QtcProcessPrivate::slotError); - connect(this, &QProcess::readyReadStandardOutput, d, [this] { - d->m_hangTimerCount = 0; - d->m_stdOut.append(readAllStandardOutput(), true); - }); - connect(this, &QProcess::readyReadStandardError, d, [this] { - d->m_hangTimerCount = 0; - d->m_stdErr.append(readAllStandardError(), true); - }); + connect(d->m_process, &QProcess::errorOccurred, d, &QtcProcessPrivate::slotError); } SynchronousProcess::~SynchronousProcess() @@ -818,8 +973,6 @@ void SynchronousProcess::runBlocking() d->m_result = QtcProcess::Finished; d->m_exitCode = exitCode(); - d->m_stdOut.rawData += readAllStandardOutput(); - d->m_stdErr.rawData += readAllStandardError(); return; }; @@ -833,7 +986,7 @@ void SynchronousProcess::runBlocking() if (d->m_processUserEvents) { if (!d->m_writeData.isEmpty()) { - connect(this, &QProcess::started, this, [this] { + connect(d->m_process, &QProcess::started, this, [this] { write(d->m_writeData); closeWriteChannel(); }); @@ -851,8 +1004,8 @@ void SynchronousProcess::runBlocking() QApplication::setOverrideCursor(Qt::WaitCursor); #endif d->m_eventLoop.exec(QEventLoop::ExcludeUserInputEvents); - d->m_stdOut.append(readAllStandardOutput(), false); - d->m_stdErr.append(readAllStandardError(), false); + d->m_stdOut.append(d->m_process->readAllStandardOutput()); + d->m_stdErr.append(d->m_process->readAllStandardError()); d->m_timer.stop(); #ifdef QT_GUI_LIB @@ -887,8 +1040,8 @@ void SynchronousProcess::runBlocking() else d->m_result = d->interpretExitCode(d->m_exitCode); } - d->m_stdOut.append(readAllStandardOutput(), false); - d->m_stdErr.append(readAllStandardError(), false); + d->m_stdOut.append(d->m_process->readAllStandardOutput()); + d->m_stdErr.append(d->m_process->readAllStandardError()); } } diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index 44e24fc93ad..a5b3a11c92e 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -52,7 +52,7 @@ public: std::function<Environment(const FilePath &)> systemEnvironmentForBinary; }; -class QTCREATOR_UTILS_EXPORT QtcProcess : public QProcess +class QTCREATOR_UTILS_EXPORT QtcProcess : public QObject { Q_OBJECT @@ -78,6 +78,9 @@ public: void setCommand(const CommandLine &cmdLine); const CommandLine &commandLine() const; + QString workingDirectory() const; + void setWorkingDirectory(const QString &dir); + void setUseCtrlCStub(bool enabled); void setLowPriority(); void setDisableUnixTerminal(); @@ -103,7 +106,7 @@ public: static void setRemoteProcessHooks(const DeviceProcessHooks &hooks); - void setOpenMode(OpenMode mode); + void setOpenMode(QIODevice::OpenMode mode); bool stopProcess(); bool readDataFromProcess(int timeoutS, QByteArray *stdOut, QByteArray *stdErr, @@ -134,10 +137,52 @@ public: static Environment systemEnvironmentForBinary(const FilePath &filePath); + // FIXME: Cut down the following bits inherited from QProcess and QIODevice. + + void setProcessChannelMode(QProcess::ProcessChannelMode mode); + + QProcess::ProcessError error() const; + QProcess::ProcessState state() const; + + QString errorString() const; + void setErrorString(const QString &str); + + qint64 processId() const; + + bool waitForStarted(int msecs = 30000); + bool waitForReadyRead(int msecs = 30000); + bool waitForFinished(int msecs = 30000); + + QByteArray readAllStandardOutput(); + QByteArray readAllStandardError(); + QByteArray readAll(); + QByteArray readLine(); + + QProcess::ExitStatus exitStatus() const; + + void kill(); + + qint64 write(const QByteArray &input); + void closeWriteChannel(); + void close(); + void setReadChannel(QProcess::ProcessChannel channel); + bool canReadLine() const; + bool atEnd() const; + + QIODevice *ioDevice(); // FIXME: Remove. + +signals: + void started(); + void finished(int exitCode, QProcess::ExitStatus exitStatus); + void errorOccurred(QProcess::ProcessError error); + void stateChanged(QProcess::ProcessState state); + + void readyReadStandardOutput(); + void readyReadStandardError(); + void readyRead(); + + private: -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) - void setupChildProcess() override; -#endif friend class SynchronousProcess; friend QTCREATOR_UTILS_EXPORT QDebug operator<<(QDebug str, const QtcProcess &r); diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp index bb32daab18b..efd1b2c5998 100644 --- a/src/plugins/android/androidsdkmanager.cpp +++ b/src/plugins/android/androidsdkmanager.cpp @@ -1086,7 +1086,7 @@ void AndroidSdkManagerPrivate::getPendingLicense(SdkCmdFutureInterface &fi) } m_licenseTextCache.clear(); - result.success = licenseCommand.exitStatus() == QtcProcess::NormalExit; + result.success = licenseCommand.exitStatus() == QProcess::NormalExit; if (!result.success) { result.stdError = QCoreApplication::translate("Android::Internal::AndroidSdkManager", "License command failed.\n\n"); diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index 1e566eb3c0b..3ad388ac267 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -730,8 +730,7 @@ void AndroidSettingsWidget::downloadOpenSslRepo(const bool silent) openButton->deleteLater(); }; - connect(gitCloner, - QOverload<int, QtcProcess::ExitStatus>::of(&QtcProcess::finished), + connect(gitCloner, &QtcProcess::finished, m_ui.openSslPathChooser, [=](int exitCode, QProcess::ExitStatus exitStatus) { openSslProgressDialog->close(); @@ -739,7 +738,7 @@ void AndroidSettingsWidget::downloadOpenSslRepo(const bool silent) m_ui.openSslPathChooser->triggerChanged(); // After cloning, the path exists if (!openSslProgressDialog->wasCanceled() - || (exitStatus == QtcProcess::NormalExit && exitCode != 0)) { + || (exitStatus == QProcess::NormalExit && exitCode != 0)) { failDialog(); } }); diff --git a/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.cpp b/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.cpp index 05aaa59c429..aad7c350d33 100644 --- a/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.cpp +++ b/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.cpp @@ -380,31 +380,22 @@ UvscServerProviderRunner::UvscServerProviderRunner(ProjectExplorer::RunControl * { setId("BareMetalUvscServer"); - const QString program = runnable.executable.toString(); - const QStringList args = runnable.commandLineArguments.split(' '); - m_process.setProgram(program); - m_process.setArguments(args); + m_process.setCommand(runnable.commandLine()); - connect(&m_process, &QtcProcess::started, this, [this]() { + connect(&m_process, &QtcProcess::started, this, [this] { ProcessHandle pid(m_process.processId()); this->runControl()->setApplicationProcessHandle(pid); reportStarted(); }); - connect(&m_process, - QOverload<int, QProcess::ExitStatus>::of(&QtcProcess::finished), - this, - [this](int exitCode, QProcess::ExitStatus status) { - const QString msg = (status == QProcess::CrashExit) - ? RunControl::tr("%1 crashed.") - : RunControl::tr("%2 exited with code %1").arg(exitCode); - appendMessage(msg.arg(m_process.program()), Utils::NormalMessageFormat); - reportStopped(); - }); + connect(&m_process, &QtcProcess::finished, this, [this] { + appendMessage(m_process.exitMessage(), NormalMessageFormat); + reportStopped(); + }); connect(&m_process, &QtcProcess::errorOccurred, this, [this] (QProcess::ProcessError error) { if (error == QProcess::Timedout) return; // No actual change on the process side. const QString msg = userMessageForProcessError( - error, FilePath::fromString(m_process.program())); + error, m_process.commandLine().executable()); appendMessage(msg, Utils::NormalMessageFormat); reportStopped(); }); @@ -412,8 +403,8 @@ UvscServerProviderRunner::UvscServerProviderRunner(ProjectExplorer::RunControl * void UvscServerProviderRunner::start() { - const QString msg = RunControl::tr("Starting %1 %2...") - .arg(m_process.program()).arg(m_process.arguments().join(' ')); + const QString msg = RunControl::tr("Starting %1 ...") + .arg(m_process.commandLine().toUserOutput()); appendMessage(msg, Utils::NormalMessageFormat); m_process.start(); diff --git a/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.h b/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.h index dbc054e02fd..435c09cc8de 100644 --- a/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.h +++ b/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.h @@ -32,6 +32,8 @@ #include <projectexplorer/runcontrol.h> // for RunWorker +#include <utils/qtcprocess.h> + namespace Utils { class PathChooser; } namespace BareMetal { @@ -149,7 +151,7 @@ private: void start() final; void stop() final; - QProcess m_process; + Utils::QtcProcess m_process; }; } // namespace Internal diff --git a/src/plugins/clangtools/clangtoolrunner.cpp b/src/plugins/clangtools/clangtoolrunner.cpp index 6c27ed8aa74..db461f72fb5 100644 --- a/src/plugins/clangtools/clangtoolrunner.cpp +++ b/src/plugins/clangtools/clangtoolrunner.cpp @@ -83,13 +83,11 @@ void ClangToolRunner::init(const QString &outputDirPath, const Environment &envi m_outputDirPath = outputDirPath; QTC_CHECK(!m_outputDirPath.isEmpty()); - m_process->setProcessChannelMode(QProcess::MergedChannels); m_process->setEnvironment(environment); m_process->setWorkingDirectory(m_outputDirPath); // Current clang-cl puts log file into working dir. - connect(m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), - this, &ClangToolRunner::onProcessFinished); - connect(m_process, &QProcess::errorOccurred, this, &ClangToolRunner::onProcessError); - connect(m_process, &QProcess::readyRead, this, &ClangToolRunner::onProcessOutput); + connect(m_process, &QtcProcess::finished, this, &ClangToolRunner::onProcessFinished); + connect(m_process, &QtcProcess::errorOccurred, this, &ClangToolRunner::onProcessError); + connect(m_process, &QtcProcess::readyRead, this, &ClangToolRunner::onProcessOutput); } QStringList ClangToolRunner::mainToolArguments() const diff --git a/src/plugins/cmakeprojectmanager/cmakeprocess.cpp b/src/plugins/cmakeprojectmanager/cmakeprocess.cpp index e4daea68450..efabe3f52a8 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprocess.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprocess.cpp @@ -35,6 +35,8 @@ #include <utils/stringutils.h> +using namespace Utils; + namespace CMakeProjectManager { namespace Internal { @@ -104,11 +106,11 @@ void CMakeProcess::run(const BuildDirParameters ¶meters, const QStringList & process->setWorkingDirectory(workDirectory.toString()); process->setEnvironment(parameters.environment); - connect(process.get(), &QProcess::readyReadStandardOutput, + connect(process.get(), &QtcProcess::readyReadStandardOutput, this, &CMakeProcess::processStandardOutput); - connect(process.get(), &QProcess::readyReadStandardError, + connect(process.get(), &QtcProcess::readyReadStandardError, this, &CMakeProcess::processStandardError); - connect(process.get(), QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), + connect(process.get(), &QtcProcess::finished, this, &CMakeProcess::handleProcessFinished); Utils::CommandLine commandLine(cmake->cmakeExecutable(), QStringList({"-S", srcDir, QString("-B"), workDirectory.toString()}) + arguments); diff --git a/src/plugins/coreplugin/externaltool.cpp b/src/plugins/coreplugin/externaltool.cpp index ceaa1465e46..19c51e0283f 100644 --- a/src/plugins/coreplugin/externaltool.cpp +++ b/src/plugins/coreplugin/externaltool.cpp @@ -653,13 +653,12 @@ void ExternalToolRunner::run() } } m_process = new QtcProcess(this); - connect(m_process, &QProcess::started, this, &ExternalToolRunner::started); - connect(m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), - this, &ExternalToolRunner::finished); - connect(m_process, &QProcess::errorOccurred, this, &ExternalToolRunner::error); - connect(m_process, &QProcess::readyReadStandardOutput, + connect(m_process, &QtcProcess::started, this, &ExternalToolRunner::started); + connect(m_process, &QtcProcess::finished, this, &ExternalToolRunner::finished); + connect(m_process, &QtcProcess::errorOccurred, this, &ExternalToolRunner::error); + connect(m_process, &QtcProcess::readyReadStandardOutput, this, &ExternalToolRunner::readStandardOutput); - connect(m_process, &QProcess::readyReadStandardError, + connect(m_process, &QtcProcess::readyReadStandardError, this, &ExternalToolRunner::readStandardError); if (!m_resolvedWorkingDirectory.isEmpty()) m_process->setWorkingDirectory(m_resolvedWorkingDirectory); diff --git a/src/plugins/coreplugin/locator/executefilter.cpp b/src/plugins/coreplugin/locator/executefilter.cpp index be0af47dde8..a7ed2d1dc59 100644 --- a/src/plugins/coreplugin/locator/executefilter.cpp +++ b/src/plugins/coreplugin/locator/executefilter.cpp @@ -34,6 +34,8 @@ using namespace Core; using namespace Core::Internal; +using namespace Utils; + ExecuteFilter::ExecuteFilter() { setId("Execute custom commands"); @@ -47,10 +49,9 @@ ExecuteFilter::ExecuteFilter() m_process = new Utils::QtcProcess(this); m_process->setEnvironment(Utils::Environment::systemEnvironment()); - connect(m_process, QOverload<int ,QProcess::ExitStatus>::of(&QProcess::finished), - this, &ExecuteFilter::finished); - connect(m_process, &QProcess::readyReadStandardOutput, this, &ExecuteFilter::readStandardOutput); - connect(m_process, &QProcess::readyReadStandardError, this, &ExecuteFilter::readStandardError); + connect(m_process, &QtcProcess::finished, this, &ExecuteFilter::finished); + connect(m_process, &QtcProcess::readyReadStandardOutput, this, &ExecuteFilter::readStandardOutput); + connect(m_process, &QtcProcess::readyReadStandardError, this, &ExecuteFilter::readStandardError); m_runTimer.setSingleShot(true); connect(&m_runTimer, &QTimer::timeout, this, &ExecuteFilter::runHeadCommand); diff --git a/src/plugins/coreplugin/locator/spotlightlocatorfilter.cpp b/src/plugins/coreplugin/locator/spotlightlocatorfilter.cpp index 1c507174c73..84ecaa762f7 100644 --- a/src/plugins/coreplugin/locator/spotlightlocatorfilter.cpp +++ b/src/plugins/coreplugin/locator/spotlightlocatorfilter.cpp @@ -92,16 +92,14 @@ SpotlightIterator::SpotlightIterator(const QStringList &command) m_process->setCommand({Environment::systemEnvironment().searchInPath(command.first()), command.mid(1)}); m_process->setEnvironment(Utils::Environment::systemEnvironment()); - QObject::connect(m_process.get(), - QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), - [this] { scheduleKillProcess(); }); - QObject::connect(m_process.get(), &QProcess::errorOccurred, [this, command] { + QObject::connect(m_process.get(), &QtcProcess::finished, [this] { scheduleKillProcess(); }); + QObject::connect(m_process.get(), &QtcProcess::errorOccurred, [this, command] { MessageManager::writeFlashing( SpotlightLocatorFilter::tr("Locator: Error occurred when running \"%1\".") .arg(command.first())); scheduleKillProcess(); }); - QObject::connect(m_process.get(), &QProcess::readyReadStandardOutput, [this] { + QObject::connect(m_process.get(), &QtcProcess::readyReadStandardOutput, [this] { QString output = QString::fromUtf8(m_process->readAllStandardOutput()); output.replace("\r\n", "\n"); const QStringList items = output.split('\n'); diff --git a/src/plugins/coreplugin/patchtool.cpp b/src/plugins/coreplugin/patchtool.cpp index 345673e1172..288e9d5dd52 100644 --- a/src/plugins/coreplugin/patchtool.cpp +++ b/src/plugins/coreplugin/patchtool.cpp @@ -112,8 +112,11 @@ static bool runPatchHelper(const QByteArray &input, const QString &workingDirect .arg(patch, patchProcess.errorString())); return false; } + + patchProcess.write(input); patchProcess.closeWriteChannel(); + QByteArray stdOut; QByteArray stdErr; if (!patchProcess.readDataFromProcess(30, &stdOut, &stdErr, true)) { diff --git a/src/plugins/cppcheck/cppcheckrunner.cpp b/src/plugins/cppcheck/cppcheckrunner.cpp index 20cdf34af25..51ecc0bd71f 100644 --- a/src/plugins/cppcheck/cppcheckrunner.cpp +++ b/src/plugins/cppcheck/cppcheckrunner.cpp @@ -49,13 +49,13 @@ CppcheckRunner::CppcheckRunner(CppcheckTool &tool) : m_maxArgumentsLength = std::max(argMax.toInt(), m_maxArgumentsLength); } - connect(m_process, &QProcess::readyReadStandardOutput, + connect(m_process, &QtcProcess::readyReadStandardOutput, this, &CppcheckRunner::readOutput); - connect(m_process, &QProcess::readyReadStandardOutput, + connect(m_process, &QtcProcess::readyReadStandardOutput, this, &CppcheckRunner::readError); - connect(m_process, &QProcess::started, + connect(m_process, &QtcProcess::started, this, &CppcheckRunner::handleStarted); - connect(m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), + connect(m_process, &QtcProcess::finished, this, &CppcheckRunner::handleFinished); m_queueTimer.setSingleShot(true); @@ -128,8 +128,7 @@ const Utils::FilePaths &CppcheckRunner::currentFiles() const QString CppcheckRunner::currentCommand() const { - return m_process->program() + ' ' + - m_process->arguments().join(' '); + return m_process->commandLine().toUserOutput(); } void CppcheckRunner::checkQueued() diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 44cc230c930..acdd042d07f 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -205,12 +205,11 @@ CdbEngine::CdbEngine() : DebuggerSettings *s = debuggerSettings(); connect(s->createFullBacktrace.action(), &QAction::triggered, this, &CdbEngine::createFullBacktrace); - connect(&m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), - this, &CdbEngine::processFinished); - connect(&m_process, &QProcess::errorOccurred, this, &CdbEngine::processError); - connect(&m_process, &QProcess::readyReadStandardOutput, + connect(&m_process, &QtcProcess::finished, this, &CdbEngine::processFinished); + connect(&m_process, &QtcProcess::errorOccurred, this, &CdbEngine::processError); + connect(&m_process, &QtcProcess::readyReadStandardOutput, this, &CdbEngine::readyReadStandardOut); - connect(&m_process, &QProcess::readyReadStandardError, + connect(&m_process, &QtcProcess::readyReadStandardError, this, &CdbEngine::readyReadStandardOut); connect(&s->useDebuggingHelpers, &BaseAspect::changed, this, &CdbEngine::updateLocals); diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index b92d3553696..25f5b837dbf 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -103,13 +103,13 @@ public: LocalProcessRunner(DebuggerRunTool *runTool, const CommandLine &command) : RunWorker(runTool->runControl()), m_runTool(runTool), m_command(command) { - connect(&m_proc, &QProcess::errorOccurred, + connect(&m_proc, &QtcProcess::errorOccurred, this, &LocalProcessRunner::handleError); - connect(&m_proc, &QProcess::readyReadStandardOutput, + connect(&m_proc, &QtcProcess::readyReadStandardOutput, this, &LocalProcessRunner::handleStandardOutput); - connect(&m_proc, &QProcess::readyReadStandardError, + connect(&m_proc, &QtcProcess::readyReadStandardError, this, &LocalProcessRunner::handleStandardError); - connect(&m_proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), + connect(&m_proc, &QtcProcess::finished, this, &LocalProcessRunner::handleFinished); } diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 67ced04fb2f..ec548e4f625 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -166,9 +166,9 @@ GdbEngine::GdbEngine() connect(&s.useDynamicType, &BaseAspect::changed, this, &GdbEngine::reloadLocals); - connect(&m_gdbProc, &QProcess::errorOccurred, + connect(&m_gdbProc, &QtcProcess::errorOccurred, this, &GdbEngine::handleGdbError); - connect(&m_gdbProc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), + connect(&m_gdbProc, &QtcProcess::finished, this, &GdbEngine::handleGdbFinished); connect(&m_gdbProc, &QtcProcess::readyReadStandardOutput, this, &GdbEngine::readGdbStandardOutput); diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 516035226ee..959bacecc00 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -98,13 +98,13 @@ LldbEngine::LldbEngine() connect(&ds.intelFlavor, &BaseAspect::changed, this, &LldbEngine::updateAll); - connect(&m_lldbProc, &QProcess::errorOccurred, + connect(&m_lldbProc, &QtcProcess::errorOccurred, this, &LldbEngine::handleLldbError); - connect(&m_lldbProc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), + connect(&m_lldbProc, &QtcProcess::finished, this, &LldbEngine::handleLldbFinished); - connect(&m_lldbProc, &QProcess::readyReadStandardOutput, + connect(&m_lldbProc, &QtcProcess::readyReadStandardOutput, this, &LldbEngine::readLldbStandardOutput); - connect(&m_lldbProc, &QProcess::readyReadStandardError, + connect(&m_lldbProc, &QtcProcess::readyReadStandardError, this, &LldbEngine::readLldbStandardError); connect(this, &LldbEngine::outputReady, diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index d0e9335deb9..70a2f9a5a1c 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -129,14 +129,13 @@ void DockerDeviceProcess::start(const Runnable &runnable) m_process.setCommand(runnable.commandLine()); m_process.setEnvironment(runnable.environment); m_process.setWorkingDirectory(runnable.workingDirectory); - connect(&m_process, &QProcess::errorOccurred, this, &DeviceProcess::error); - connect(&m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), - this, &DeviceProcess::finished); - connect(&m_process, &QProcess::readyReadStandardOutput, + connect(&m_process, &QtcProcess::errorOccurred, this, &DeviceProcess::error); + connect(&m_process, &QtcProcess::finished, this, &DeviceProcess::finished); + connect(&m_process, &QtcProcess::readyReadStandardOutput, this, &DeviceProcess::readyReadStandardOutput); - connect(&m_process, &QProcess::readyReadStandardError, + connect(&m_process, &QtcProcess::readyReadStandardError, this, &DeviceProcess::readyReadStandardError); - connect(&m_process, &QProcess::started, this, &DeviceProcess::started); + connect(&m_process, &QtcProcess::started, this, &DeviceProcess::started); dockerDevice->runProcess(m_process); } diff --git a/src/plugins/docker/dockersettings.cpp b/src/plugins/docker/dockersettings.cpp index 8161ba88c3d..2f5b81ac7cd 100644 --- a/src/plugins/docker/dockersettings.cpp +++ b/src/plugins/docker/dockersettings.cpp @@ -83,8 +83,7 @@ void DockerSettings::updateImageList() QtcProcess process; process.setCommand({"docker", {"search", imageListFilter.value()}}); - const auto finished = QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished); - connect(&process, finished, this, [&process, this] { + connect(&process, &QtcProcess::finished, this, [&process, this] { const QString data = QString::fromUtf8(process.readAll()); imageList.setValue(data); }); diff --git a/src/plugins/git/gerrit/gerritmodel.cpp b/src/plugins/git/gerrit/gerritmodel.cpp index 5a4312c60c4..7558cfd50de 100644 --- a/src/plugins/git/gerrit/gerritmodel.cpp +++ b/src/plugins/git/gerrit/gerritmodel.cpp @@ -52,6 +52,7 @@ enum { debug = 0 }; +using namespace Utils; using namespace VcsBase; namespace Gerrit { @@ -283,17 +284,16 @@ QueryContext::QueryContext(const QString &query, + "&o=CURRENT_REVISION&o=DETAILED_LABELS&o=DETAILED_ACCOUNTS"; m_arguments = server.curlArguments() << url; } - connect(&m_process, &QProcess::readyReadStandardError, this, [this] { + connect(&m_process, &QtcProcess::readyReadStandardError, this, [this] { const QString text = QString::fromLocal8Bit(m_process.readAllStandardError()); VcsOutputWindow::appendError(text); m_error.append(text); }); - connect(&m_process, &QProcess::readyReadStandardOutput, this, [this] { + connect(&m_process, &QtcProcess::readyReadStandardOutput, this, [this] { m_output.append(m_process.readAllStandardOutput()); }); - connect(&m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), - this, &QueryContext::processFinished); - connect(&m_process, &QProcess::errorOccurred, this, &QueryContext::processError); + connect(&m_process, &QtcProcess::finished, this, &QueryContext::processFinished); + connect(&m_process, &QtcProcess::errorOccurred, this, &QueryContext::processError); connect(&m_watcher, &QFutureWatcherBase::canceled, this, &QueryContext::terminate); m_watcher.setFuture(m_progress.future()); m_process.setEnvironment(Git::Internal::GitClient::instance()->processEnvironment()); @@ -383,8 +383,7 @@ void QueryContext::timeout() arg(timeOutMS / 1000), QMessageBox::NoButton, parent); QPushButton *terminateButton = box.addButton(tr("Terminate"), QMessageBox::YesRole); box.addButton(tr("Keep Running"), QMessageBox::NoRole); - connect(&m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), - &box, &QDialog::reject); + connect(&m_process, &QtcProcess::finished, &box, &QDialog::reject); box.exec(); if (m_process.state() != QProcess::Running) return; diff --git a/src/plugins/git/gerrit/gerritplugin.cpp b/src/plugins/git/gerrit/gerritplugin.cpp index 84a2e6abcbe..81da7025941 100644 --- a/src/plugins/git/gerrit/gerritplugin.cpp +++ b/src/plugins/git/gerrit/gerritplugin.cpp @@ -140,12 +140,11 @@ FetchContext::FetchContext(const QSharedPointer<GerritChange> &change, , m_server(server) , m_state(FetchState) { - connect(&m_process, &QProcess::errorOccurred, this, &FetchContext::processError); - connect(&m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), - this, &FetchContext::processFinished); - connect(&m_process, &QProcess::readyReadStandardError, + connect(&m_process, &QtcProcess::errorOccurred, this, &FetchContext::processError); + connect(&m_process, &QtcProcess::finished, this, &FetchContext::processFinished); + connect(&m_process, &QtcProcess::readyReadStandardError, this, &FetchContext::processReadyReadStandardError); - connect(&m_process, &QProcess::readyReadStandardOutput, + connect(&m_process, &QtcProcess::readyReadStandardOutput, this, &FetchContext::processReadyReadStandardOutput); connect(&m_watcher, &QFutureWatcher<void>::canceled, this, &FetchContext::terminate); m_watcher.setFuture(m_progress.future()); diff --git a/src/plugins/languageclient/languageclientinterface.cpp b/src/plugins/languageclient/languageclientinterface.cpp index 203c4978975..a12472526ef 100644 --- a/src/plugins/languageclient/languageclientinterface.cpp +++ b/src/plugins/languageclient/languageclientinterface.cpp @@ -30,6 +30,7 @@ #include <QLoggingCategory> using namespace LanguageServerProtocol; +using namespace Utils; static Q_LOGGING_CATEGORY(LOGLSPCLIENTV, "qtc.languageclient.messages", QtWarningMsg); @@ -88,11 +89,11 @@ void BaseClientInterface::parseData(const QByteArray &data) StdIOClientInterface::StdIOClientInterface() { - connect(&m_process, &QProcess::readyReadStandardError, + connect(&m_process, &QtcProcess::readyReadStandardError, this, &StdIOClientInterface::readError); - connect(&m_process, &QProcess::readyReadStandardOutput, + connect(&m_process, &QtcProcess::readyReadStandardOutput, this, &StdIOClientInterface::readOutput); - connect(&m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), + connect(&m_process, &QtcProcess::finished, this, &StdIOClientInterface::onProcessFinished); } @@ -124,7 +125,8 @@ void StdIOClientInterface::setWorkingDirectory(const QString &workingDirectory) void StdIOClientInterface::sendData(const QByteArray &data) { if (m_process.state() != QProcess::Running) { - emit error(tr("Cannot send data to unstarted server %1").arg(m_process.program())); + emit error(tr("Cannot send data to unstarted server %1") + .arg(m_process.commandLine().toUserOutput())); return; } qCDebug(LOGLSPCLIENTV) << "StdIOClient send data:"; diff --git a/src/plugins/mesonprojectmanager/project/mesonprocess.cpp b/src/plugins/mesonprojectmanager/project/mesonprocess.cpp index 7fe551bb6bc..a761f9dc2f6 100644 --- a/src/plugins/mesonprojectmanager/project/mesonprocess.cpp +++ b/src/plugins/mesonprojectmanager/project/mesonprocess.cpp @@ -37,6 +37,8 @@ #include <QLoggingCategory> +using namespace Utils; + namespace MesonProjectManager { namespace Internal { @@ -164,19 +166,16 @@ void MesonProcess::setupProcess(const Command &command, if (m_process) disconnect(m_process.get()); m_process = std::make_unique<Utils::QtcProcess>(); - connect(m_process.get(), - QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), - this, - &MesonProcess::handleProcessFinished); - connect(m_process.get(), &QProcess::errorOccurred, this, &MesonProcess::handleProcessError); + connect(m_process.get(), &QtcProcess::finished, this, &MesonProcess::handleProcessFinished); + connect(m_process.get(), &QtcProcess::errorOccurred, this, &MesonProcess::handleProcessError); if (!captureStdo) { connect(m_process.get(), - &QProcess::readyReadStandardOutput, + &QtcProcess::readyReadStandardOutput, this, &MesonProcess::processStandardOutput); connect(m_process.get(), - &QProcess::readyReadStandardError, + &QtcProcess::readyReadStandardError, this, &MesonProcess::processStandardError); } diff --git a/src/plugins/perforce/perforcechecker.cpp b/src/plugins/perforce/perforcechecker.cpp index 060f1c221e7..620fb76fcd7 100644 --- a/src/plugins/perforce/perforcechecker.cpp +++ b/src/plugins/perforce/perforcechecker.cpp @@ -34,14 +34,15 @@ #include <QRegularExpression> #include <QTimer> +using namespace Utils; + namespace Perforce { namespace Internal { PerforceChecker::PerforceChecker(QObject *parent) : QObject(parent) { - connect(&m_process, &QProcess::errorOccurred, this, &PerforceChecker::slotError); - connect(&m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), - this, &PerforceChecker::slotFinished); + connect(&m_process, &QtcProcess::errorOccurred, this, &PerforceChecker::slotError); + connect(&m_process, &QtcProcess::finished, this, &PerforceChecker::slotFinished); } PerforceChecker::~PerforceChecker() diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp index 8156eb02b28..fa6a506ec12 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.cpp +++ b/src/plugins/projectexplorer/abstractprocessstep.cpp @@ -99,7 +99,7 @@ class AbstractProcessStep::Private public: Private(AbstractProcessStep *q) : q(q) {} - void cleanUp(QProcess *process); + void cleanUp(QtcProcess *process); AbstractProcessStep *q; std::unique_ptr<QtcProcess> m_process; @@ -232,11 +232,11 @@ void AbstractProcessStep::doRun() if (d->m_lowPriority && ProjectExplorerPlugin::projectExplorerSettings().lowBuildPriority) d->m_process->setLowPriority(); - connect(d->m_process.get(), &QProcess::readyReadStandardOutput, + connect(d->m_process.get(), &QtcProcess::readyReadStandardOutput, this, &AbstractProcessStep::processReadyReadStdOutput); - connect(d->m_process.get(), &QProcess::readyReadStandardError, + connect(d->m_process.get(), &QtcProcess::readyReadStandardError, this, &AbstractProcessStep::processReadyReadStdError); - connect(d->m_process.get(), QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), + connect(d->m_process.get(), &QtcProcess::finished, this, &AbstractProcessStep::slotProcessFinished); d->m_process->start(); @@ -282,7 +282,7 @@ void AbstractProcessStep::setupProcessParameters(ProcessParameters *params) cons params->setCommandLine(d->m_commandLineProvider()); } -void AbstractProcessStep::Private::cleanUp(QProcess *process) +void AbstractProcessStep::Private::cleanUp(QtcProcess *process) { // The process has finished, leftover data is read in processFinished q->processFinished(process->exitCode(), process->exitStatus()); @@ -400,9 +400,9 @@ void AbstractProcessStep::finish(bool success) void AbstractProcessStep::slotProcessFinished(int, QProcess::ExitStatus) { - QProcess *process = d->m_process.get(); + QtcProcess *process = d->m_process.get(); if (!process) // Happens when the process was canceled and handed over to the Reaper. - process = qobject_cast<QProcess *>(sender()); // The process was canceled! + process = qobject_cast<QtcProcess *>(sender()); // The process was canceled! if (process) { stdError(d->stderrStream->toUnicode(process->readAllStandardError())); stdOutput(d->stdoutStream->toUnicode(process->readAllStandardOutput())); diff --git a/src/plugins/projectexplorer/applicationlauncher.cpp b/src/plugins/projectexplorer/applicationlauncher.cpp index 5ca295f3733..449c52e8fe7 100644 --- a/src/plugins/projectexplorer/applicationlauncher.cpp +++ b/src/plugins/projectexplorer/applicationlauncher.cpp @@ -131,18 +131,18 @@ ApplicationLauncherPrivate::ApplicationLauncherPrivate(ApplicationLauncher *pare m_guiProcess.setProcessChannelMode(QProcess::MergedChannels); } else { m_guiProcess.setProcessChannelMode(QProcess::SeparateChannels); - connect(&m_guiProcess, &QProcess::readyReadStandardError, + connect(&m_guiProcess, &QtcProcess::readyReadStandardError, this, &ApplicationLauncherPrivate::readLocalStandardError); } - connect(&m_guiProcess, &QProcess::readyReadStandardOutput, + connect(&m_guiProcess, &QtcProcess::readyReadStandardOutput, this, &ApplicationLauncherPrivate::readLocalStandardOutput); - connect(&m_guiProcess, &QProcess::errorOccurred, + connect(&m_guiProcess, &QtcProcess::errorOccurred, this, &ApplicationLauncherPrivate::localGuiProcessError); - connect(&m_guiProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), + connect(&m_guiProcess, &QtcProcess::finished, this, &ApplicationLauncherPrivate::localProcessDone); - connect(&m_guiProcess, &QProcess::started, + connect(&m_guiProcess, &QtcProcess::started, this, &ApplicationLauncherPrivate::handleProcessStarted); - connect(&m_guiProcess, &QProcess::errorOccurred, + connect(&m_guiProcess, &QtcProcess::errorOccurred, q, &ApplicationLauncher::error); m_consoleProcess.setSettings(Core::ICore::settings()); diff --git a/src/plugins/python/pythonutils.cpp b/src/plugins/python/pythonutils.cpp index d693c2597bc..a8a8467f30a 100644 --- a/src/plugins/python/pythonutils.cpp +++ b/src/plugins/python/pythonutils.cpp @@ -251,15 +251,15 @@ public: { Core::ProgressManager::addTask(m_future.future(), "Install PyLS", installPylsTaskId); connect(&m_process, - QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), + &QtcProcess::finished, this, &PythonLSInstallHelper::installFinished); connect(&m_process, - &QProcess::readyReadStandardError, + &QtcProcess::readyReadStandardError, this, &PythonLSInstallHelper::errorAvailable); connect(&m_process, - &QProcess::readyReadStandardOutput, + &QtcProcess::readyReadStandardOutput, this, &PythonLSInstallHelper::outputAvailable); @@ -276,8 +276,8 @@ public: m_process.start(); Core::MessageManager::writeDisrupting( - tr("Running \"%1 %2\" to install Python language server") - .arg(m_process.program(), m_process.arguments().join(' '))); + tr("Running \"%1\" to install Python language server") + .arg(m_process.commandLine().toUserOutput())); m_killTimer.setSingleShot(true); m_killTimer.start(5 /*minutes*/ * 60 * 1000); diff --git a/src/plugins/qnx/qnxutils.cpp b/src/plugins/qnx/qnxutils.cpp index 5e5d762432f..a09e6ee0f11 100644 --- a/src/plugins/qnx/qnxutils.cpp +++ b/src/plugins/qnx/qnxutils.cpp @@ -127,7 +127,7 @@ EnvironmentItems QnxUtils::qnxEnvironmentFromEnvFile(const QString &fileName) return items; // parsing process output - QTextStream str(&process); + QTextStream str(process.ioDevice()); while (!str.atEnd()) { QString line = str.readLine(); int equalIndex = line.indexOf(QLatin1Char('=')); diff --git a/src/plugins/winrt/winrtdevice.cpp b/src/plugins/winrt/winrtdevice.cpp index 9172b155399..459f2d097ef 100644 --- a/src/plugins/winrt/winrtdevice.cpp +++ b/src/plugins/winrt/winrtdevice.cpp @@ -145,9 +145,8 @@ void WinRtDeviceFactory::autoDetect() if (!m_process) { qCDebug(winrtDeviceLog) << __FUNCTION__ << "Creating process"; m_process = new Utils::QtcProcess(this); - connect(m_process, &QProcess::errorOccurred, this, &WinRtDeviceFactory::onProcessError); - connect(m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), - this, &WinRtDeviceFactory::onProcessFinished); + connect(m_process, &QtcProcess::errorOccurred, this, &WinRtDeviceFactory::onProcessError); + connect(m_process, &QtcProcess::finished, this, &WinRtDeviceFactory::onProcessFinished); } const CommandLine cmd{runnerFilePath, {"--list-devices"}}; diff --git a/src/plugins/winrt/winrtrunnerhelper.cpp b/src/plugins/winrt/winrtrunnerhelper.cpp index 488215acb4a..06eecc4f34d 100644 --- a/src/plugins/winrt/winrtrunnerhelper.cpp +++ b/src/plugins/winrt/winrtrunnerhelper.cpp @@ -211,12 +211,11 @@ void WinRtRunnerHelper::startWinRtRunner(const RunConf &conf) appendMessage(cmdLine.toUserOutput(), NormalMessageFormat); if (connectProcess) { - connect(process, &QProcess::started, this, &WinRtRunnerHelper::started); - connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), - this, &WinRtRunnerHelper::onProcessFinished); - connect(process, &QProcess::errorOccurred, this, &WinRtRunnerHelper::onProcessError); - connect(process, &QProcess::readyReadStandardOutput, this, &WinRtRunnerHelper::onProcessReadyReadStdOut); - connect(process, &QProcess::readyReadStandardError, this, &WinRtRunnerHelper::onProcessReadyReadStdErr); + connect(process, &QtcProcess::started, this, &WinRtRunnerHelper::started); + connect(process, &QtcProcess::finished, this, &WinRtRunnerHelper::onProcessFinished); + connect(process, &QtcProcess::errorOccurred, this, &WinRtRunnerHelper::onProcessError); + connect(process, &QtcProcess::readyReadStandardOutput, this, &WinRtRunnerHelper::onProcessReadyReadStdOut); + connect(process, &QtcProcess::readyReadStandardError, this, &WinRtRunnerHelper::onProcessReadyReadStdErr); } process->setUseCtrlCStub(true); |