Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QLineEdit处于焦点时启动的QProcess是否可以在QLineEdit处于焦点外时终止?_Qt_Raspberry Pi4 - Fatal编程技术网

Qt QLineEdit处于焦点时启动的QProcess是否可以在QLineEdit处于焦点外时终止?

Qt QLineEdit处于焦点时启动的QProcess是否可以在QLineEdit处于焦点外时终止?,qt,raspberry-pi4,Qt,Raspberry Pi4,我正在使用QtCreator 4.12创建一个应用程序,并使用触摸屏进行输入。我希望在任何QLineEdit处于焦点时弹出一个虚拟键盘,在QLineEdit处于焦点外时键盘消失。我正在为虚拟键盘使用火柴盒,正在运行: keyboard->start("/bin/sh",QStringList()<<"keyboard.sh"); keyboard->start(“/bin/sh”,QStringList()还没有测试过这一点,但我的想法

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

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

keyboard->start(“/bin/sh”,QStringList()还没有测试过这一点,但我的想法是从QLineEdit派生,并发出类似于
focusget
focusLost
的信号(从我头顶起的名字,可以随意使用任何你喜欢的名字)(比如从
focus[In | Out]事件中),因此他们可以在子进程上调用
kill
terminate
(连接到这些插槽时)。

没有“focusLost”信号,但如果您想知道小部件何时失去焦点,请在小部件中覆盖并重新实现void

当你的小部件失去焦点时,它就会被调用,这时你可以检查你的键盘是否仍然可见(或者进程是否仍在运行),然后做你想做的任何事情

编辑

下面是一个关于如何重新实施焦点事件的示例:

在您的.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();
    }
}
void YourQLineEditClass::focusInEvent(QFocusEvent*e)
{
//当线有焦点时创建键盘进程
keyboardProcess=新的QProcess(此);
键盘进程->开始(“/bin/sh”,QStringList()正在运行()
{
keyboardProcess->terminate();//或kill()
keyboardProcess->deleteLater();
}
}

Typo:change to
/bin/sh
它本身就是/bin/sh。这是原始帖子中的一个打字错误。问题是当控件移到焦点外时,如何终止在焦点内启动的进程。问题是我无法终止进程,因为在焦点内的事件与在焦点外的事件不同。通常,您cess.close()在同一个事件中终止它,但这在这里不起作用。我的解决办法是在focusOut上运行另一个bash脚本,它杀死了由focusIn的bash启动的程序,它可以工作,但并不平滑。我不明白:为什么不能终止进程?如果你有一个类成员变量
QProcess*keyboard
可以调用
keyboard->start(“/bin/sh”),QStringList()焦点输入和焦点输出事件是不同的。当控件移出该函数并且现在处于焦点输出时,如何引用在焦点输入中启动的键盘进程?