Может ли QProcess, запущенный, когда QLineEdit находится в фокусе, быть завершен, когда QLineEdit не в фокусе?

Я создаю приложение с помощью QtCreator 4.12 и использую сенсорный экран для ввода. Я хочу, чтобы виртуальная клавиатура появлялась, когда какой-либо QLineEdit находится в фокусе, и клавиатура исчезала, когда QLineEdit не в фокусе. Я использую спичечный коробок для виртуальной клавиатуры и запускаю:

keyboard->start("/bin/sh",QStringList()<<"keyboard.sh");

где файл keyboard.sh запускает команду matchbox-keyboard, чтобы вывести клавиатуру на экран. Клавиатура появляется на экране, когда QLineEdit находится в фокусе. Я не могу заставить его уйти, когда он не в фокусе.


person Anish Shah    schedule 29.08.2020    source источник
comment
Опечатка: изменить на /bin/sh   -  person eyllanesc    schedule 29.08.2020
comment
это сам /bin/sh. Это была опечатка в исходном посте. Вопрос заключается в том, как мне завершить процесс, который начался в фокусе, когда элемент управления перемещается, чтобы сфокусироваться.   -  person Anish Shah    schedule 29.08.2020


Ответы (2)


Я не проверял это, но моя идея заключалась бы в том, чтобы получить от QLineEdit и генерировать сигналы, такие как focusGotten и focusLost (имена из макушки моей головы, не стесняйтесь использовать любые, которые вы предпочитаете) соответственно (скажем, из focus[In|Out]Event), чтобы они могли вызовите kill или terminate в подпроцессе (при подключении к этим слотам).

person alagner    schedule 29.08.2020

Сигнала focusLost нет, но если вы хотите знать, когда ваш виджет потерял фокус, переопределите и переопределите void QWidget::focusOutEvent(событие QFocusEvent*) в вашем виджете.

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

РЕДАКТИРОВАТЬ

Вот пример того, как повторно реализовать события фокуса:

В вашем файле .h

class YourQLineEditClass : public QLineEdit
{
    Q_OBJECT
    .
    .
    .
protected:

    void focusInEvent(QFocusEvent* e);
    void focusOutEvent(QFocusEvent* e);

    QProcess* keyboardProcess;
};

В вашем файле .cpp

void YourQLineEditClass::focusInEvent(QFocusEvent* e)
{
    // Create the keyboard process when line has focus
    keyboardProcess = new QProcess(this);
    keyboardProcess->start("/bin/sh", QStringList() << "keyboard.sh");
}

void YourQLineEditClass::focusOutEvent(QFocusEvent* e)
{
    // Kill the keyboard process when line has lost focus
    if (keyboardProcess != nullptr && keyboardProcess->isRunning())
    {
        keyboardProcess->terminate(); // or kill()
        keyboardProcess->deleteLater();
    }
}
person Simone Mariottini    schedule 01.09.2020
comment
Проблема в том, что я не могу завершить процесс, потому что событие, когда оно находится в фокусе, отличается от того, когда оно фокусируется. Как правило, вы обрабатываете. не гладко. - person Anish Shah; 03.09.2020
comment
Я не понимаю: почему вы не можете завершить процесс? Если у вас есть переменная-член класса QProcess* keyboard, вы можете вызвать keyboard->start("/bin/sh",QStringList()<<"keyboard.sh"); в своем событии focusIn и убить его в своем focusOut. - person Simone Mariottini; 03.09.2020
comment
Фокус внутри и фокус событий различны. Как вы относитесь к тому, что ваш процесс клавиатуры был запущен в фокусе, когда элемент управления вышел из этой функции и теперь находится в фокусе? - person Anish Shah; 09.09.2020