QLineEdit不在焦点时可以终止QLineEdit时启动的QProcess吗?

问题描述

我正在使用QtCreator 4.12创建一个应用程序,并且正在使用触摸屏进行输入。我希望当任何QLineEdit处于焦点时弹出一个虚拟键盘,而当QLineEdit不在焦点时该键盘消失。我将火柴盒用于虚拟键盘并正在运行:

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

其中keyboard.sh文件运行matchBox-keyboard命令以使键盘显示在屏幕上。 当QLineEdit成为焦点时,键盘确实会在屏幕上弹出。焦点不清晰时,我无法消失。

解决方法

还没有测试过,但是我的想法是从QLineEdit派生并发出类似focusGottenfocusLost的信号(名字来自我的头顶,随意使用您喜欢的任何名称)相应地(例如,从focus[In|Out]Event开始),以便他们可以在子进程上(连接到这些插槽时)调用killterminate

,

没有“ focusLost”信号,但是如果您想知道小部件何时失去焦点,请在小部件中覆盖并重新实现void QWidget::focusOutEvent(QFocusEvent* event)

只要您的窗口小部件失去焦点,就会调用它,届时您可以检查键盘是否仍然可见(或进程是否仍在运行)并执行所需的操作。

编辑

以下是有关如何重新实现焦点事件的示例:

在您的.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();
    }
}