Почему запуск QProcess останавливает GUI в подклассе QWidget, но не в подклассе QLineEdit? - PullRequest
0 голосов
/ 28 января 2020

У меня есть простой исполняемый файл (english.exe), который меняет Windows 'язык ввода на Engli sh. Я хочу запустить этот исполняемый файл, когда пользователь взаимодействует с различными компонентами GUI.

. Если я запускаю исполняемый файл в focusInEvent из QLineEdit, я получаю ожидаемое поведение: программа запускается, и нет никакой задержки.

void MyLineEdit::focusInEvent(QFocusEvent *e)
{
    QLineEdit::focusInEvent(e);

    QProcess * switchInput = new QProcess(this);
    switchInput->start( "c:/english.exe");
}

Я хочу запустить аналогичный код при активации определенного виджета, для которого см. этот ответ . (На самом деле, я хотел бы использовать focusInEvent для QWebEngineView, но это исправленное сообщение об ошибке , несмотря на то, что событие никогда не вызывалось; я использую Qt 5.12.6.) Но со следующим код, GUI зависает.

bool MyWidget::event(QEvent *event)
{
    bool result = QWidget::event(event);
    if( event->type() == QEvent::WindowActivate )
    {
        // qDebug() << "QEvent::WindowActivate";
        QProcess * switchInput = new QProcess(this);
        switchInput->start( "c:/english.exe" );
    }
    return result;
}

Используя код qDebug(), я получаю только одно сообщение "QEvent :: WindowActivate".

В чем разница между два звонка? Есть ли альтернативное решение?


Редактировать: Какое бы решение я не нашел, оно может не представлять общего интереса. Программа, которую я запускаю, представляет собой сценарий командной строки AutoHotKey (с содержимым PostMessage, 0x50, 0, 0x0409,, A) (без вывода или взаимодействия с пользователем). Для сравнения я попытался запустить ipconfig.exe (взять программу из командной строки наугад), и проблема исчезла. Поэтому должно быть что-то в скрипте AutoHotKey или в самом AutoHotKey.

...