Qt QLineEdit处于焦点时启动的QProcess是否可以在QLineEdit处于焦点外时终止?
我正在使用QtCreator 4.12创建一个应用程序,并使用触摸屏进行输入。我希望在任何QLineEdit处于焦点时弹出一个虚拟键盘,在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()还没有测试过这一点,但我的想法
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()焦点输入和焦点输出事件是不同的。当控件移出该函数并且现在处于焦点输出时,如何引用在焦点输入中启动的键盘进程?