Окно Qt Assistant на Mac запускается за окном вызывающего

Я запускаю приложение Qt, которое запускает процесс (Qt Assistant)

Окно процесса отображается за окном звонящего, когда приложение работает на OSX …

Как я могу принести это вперед?

Код из документации Qt:

QProcess *process = new QProcess();
QStringList args;
args << QLatin1String("-collectionFile")
<< QLatin1String("mycollection.qhc");
//<< QLatin1String("-enableRemoteControl");  // can't use this, help freezes... but still starts in background! ... this is apparently a bug in Qt solved in Qt 5.4 (see Note) which I cannot use, but not relevant for current problem
process->start(QLatin1String("Assistant.app"), args);
if (!process->waitForStarted())
return;

введите описание изображения здесь

Примечание о том, что вы не используете «-enableRemoteControl» — смотрите вопрос

Помечено как дубликат / голосование за закрытое указывает на пример, который запускает процесс как отдельный. Попытка этого не решила проблему — также, помощь должна быть дочерним процессом для приложения.

Обновление на основе комментариев / размещенного ответа:

Попытка

QString app = "path/to/Assistant";   // since I use the copy from inside bundle
QString helpfile = "path/to/helpfile";
QString cmd = QString("open -a '%1' --args '-collectionFile' '%2'").arg(app).arg(helpFile);
qDebug()<<cmd;
m_helpProcess->start(cmd);
m_helpProcess->waitForStarted();
if (m_helpProcess->state() == QProcess::Running)
qDebug()<<"help started";
else
qDebug()<<m_helpProcess->errorString();

Результат:

help started (but the window doesn't show at all, I think it gives an error and closes)

(Если я скопирую путь из cmd в Terminalработает отлично, поэтому аргументы кажутся правильными …)

Обновление после попытки играть с osascript:

После кода выше, чтобы запустить помощник, я добавил (одна из многих версий activScript)

Q_PID pid = m_helpProcess->pid();

QString activateScript = "tell application System Events to perform action \"AXRaise\" of application " + app + "\n";
QString activateScript = "tell application System Events to perform action \"AXRaise\" of window with title \"My App Help\"\n";
QString activateScript = "tell application " + app + " to activate\n";
QString activateScript = "tell application Assistant activate\n";

QString activateScript = QString("tell application \"System Events\" \n") +
QString("set (frontmost of processes whose id is ") + QString::number(pid) + QString(") to true\n") +
QString("end tell\n");

QString activateScript = QString("tell application \"System Events\" \n") +
QString("tell process whose id is ") + QString::number(pid) + QString(") to activate\n") +
QString("end tell\n") + QString("end tell\n");

QString activateScript = QString("tell application \"System Events\" to perform action \"AXRaise\"") +
QString("of application whose id is ") + QString::number(pid) +
QString("end tell\n");

QString activateScript = QString("tell process whose id is ") + QString::number(pid) + QString(") to activate\n") +
QString("end tell\n");

QString osaScript = "/usr/bin/osascript";
QStringList osaArguments;
osaArguments << "-l" << "AppleScript";

QProcess p;
p.start(osaScript, osaArguments);
p.write(activateScript.toUtf8());
p.closeWriteChannel();
p.waitForStarted(-1);

Ни одна из вышеперечисленных версий скрипта не имела никакого эффекта.

(Возможность для сценариев, использующих pid, игнорировать меня, заключается в том, что osascript может использовать идентификатор окна, который может отличаться от идентификатора процесса — я искал способы получения идентификатора окна, но не нашел ничего, что я мог бы использовать из Qt. )

Дополнительное обновление:

Я создал сигнал и отправил вызывающему сообщение «emit» после запуска, чтобы, возможно, я мог что-то сделать, чтобы скрыть окно вызывающего. Попытка свести к минимуму и затем восстановить звонившего выглядела ужасно, особенно из-за анимации. Но было бы лучше, чем ничего … по крайней мере, он может уведомить пользователя о том, что что-то произошло, и, если вызывающий объект развернут, а док скрыт, показать вызывающему абоненту, что в фоновом режиме может быть помощь … Что-то , (это не совсем решение, хотя)

Ну, даже эта ужасная попытка не работает. Если справка уже запущена, то сворачивание и восстановление окна вызывающего абонента приведет к тому, что окно фоновой справки будет отображаться на мгновение, и, конечно, восстановленный вызывающий абонент отобразится над ним. Но … Если помощник запускается в первый раз, сзади НИЧЕГО нет !!! waitForStarted () уже имеет значение true, но помощнику требуется гораздо больше времени для отображения …. возможно, для загрузки своей справочной базы данных требуется слишком много времени?

Может ли это быть причиной того, что процесс всегда запускается в фоновом режиме (не фоновый процесс, а как окно за окном вызывающей стороны)? Он не отображает себя достаточно быстро, поэтому он не получает фокус? И если что-то подобное происходит, как мне это исправить?

…… Я попытался добавить таймер, а затем вызвать вышеупомянутые команды actioncript, я мог четко видеть курсор ожидания, пока окно помощника показывалось за окном приложения, но не видел эффекта, когда выполнялись элементы actioncript, поэтому все они должны быть неправильными.

Это невероятно расстраивает!

Кажется, что есть решения для этой проблемы в Windows (связывая пару, для идей):

(1) Вывести на переднее окно приложение, управляемое с помощью QProcess

(2) qt-assistant-how-to-maximize-help-window-when-qt-assistent-is-as-as-process-as

Но я не видел такого странного поведения в Linux или Windows. Кажется, это происходит только в OSX для моего приложения. Поскольку поведение процесса зависит от системы, мне нужно какое-то решение для OSX … Пожалуйста, помогите!

5

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]