6#include <QtCore/qstring.h>
7#include <QtCore/qprocess.h>
8#include <QtCore/qdir.h>
9#include <QtCore/qlibraryinfo.h>
10#include <QtCore/qdebug.h>
11#include <QtCore/qfileinfo.h>
12#include <QtCore/qobject.h>
13#include <QtCore/qtextstream.h>
14#include <QtCore/qcoreapplication.h>
18using namespace Qt::StringLiterals;
27 m_process->terminate();
28 m_process->waitForFinished();
35 const QString cmd =
"SetSource "_L1 + path;
36 return sendCommand(cmd, errorMessage);
41 const QString cmd =
"ActivateIdentifier "_L1 + identifier;
42 return sendCommand(cmd, errorMessage);
47 const QString cmd =
"ActivateKeyword "_L1 + keyword;
48 return sendCommand(cmd, errorMessage);
51bool AssistantClient::sendCommand(
const QString &cmd, QString *errorMessage)
54 qDebug() <<
"sendCommand " << cmd;
55 if (!ensureRunning(errorMessage))
57 if (!m_process->isWritable() || m_process->bytesToWrite() > 0) {
58 *errorMessage = QCoreApplication::translate(
"AssistantClient",
"Unable to send request: Assistant is not responding.");
61 QTextStream str(m_process);
68 return m_process && m_process->state() != QProcess::NotRunning;
73 QString app = QLibraryInfo::path(QLibraryInfo::BinariesPath) + QDir::separator();
74#if !defined(Q_OS_MACOS)
75 app +=
"assistant"_L1;
77 app +=
"Assistant.app/Contents/MacOS/Assistant"_L1;
90 qPrintable(QDir::toNativeSeparators(m_process->program())),
91 m_process->readAllStandardError().constData());
94void AssistantClient::processTerminated(
int exitCode, QProcess::ExitStatus exitStatus)
96 const QString binary = QDir::toNativeSeparators(m_process->program());
97 if (exitStatus != QProcess::NormalExit)
98 qWarning(
"%s: crashed.", qPrintable(binary));
99 else if (exitCode != 0)
100 qWarning(
"%s: terminated with exit code %d.", qPrintable(binary), exitCode);
109 m_process =
new QProcess;
110 QObject::connect(m_process, QOverload<
int, QProcess::ExitStatus>::of(&QProcess::finished),
111 this, &AssistantClient::processTerminated);
112 QObject::connect(m_process, &QProcess::readyReadStandardError,
113 this, &AssistantClient::readyReadStandardError);
116 const QString app = binary();
117 if (!QFileInfo(app).isFile()) {
118 *errorMessage = QCoreApplication::translate(
"AssistantClient",
"The binary '%1' does not exist.").arg(app);
122 qDebug() <<
"Running " << app;
124 QStringList args{u"-enableRemoteControl"_s};
125 m_process->start(app, args);
126 if (!m_process->waitForStarted()) {
127 *errorMessage = QCoreApplication::translate(
"AssistantClient",
"Unable to launch assistant (%1).").arg(app);
136 qtVersion = QT_VERSION;
138 QTextStream(&rc) <<
"qthelp://org.qt-project." << module <<
'.'
139 << (qtVersion >> 16) << ((qtVersion >> 8) & 0xFF) << (qtVersion & 0xFF)
140 <<
'/' << module <<
'/';
146 return documentUrl(u"qtdesigner"_s, qtVersion);
151 return documentUrl(u"qtdoc"_s, qtVersion);
bool activateIdentifier(const QString &identifier, QString *errorMessage)
bool showPage(const QString &path, QString *errorMessage)
static QString qtReferenceManualUrl(int qtVersion=0)
static QString designerManualUrl(int qtVersion=0)
static QString documentUrl(const QString &prefix, int qtVersion=0)
bool activateKeyword(const QString &keyword, QString *errorMessage)
Combined button and popup list for selecting options.