如何解决QLineEdit不在焦点时可以终止QLineEdit时启动的QProcess吗?
我正在使用QtCreator 4.12创建一个应用程序,并且正在使用触摸屏进行输入。我希望当任何QLineEdit处于焦点时弹出一个虚拟键盘,而当QLineEdit不在焦点时该键盘消失。我将火柴盒用于虚拟键盘并正在运行:
keyboard->start("/bin/sh",QStringList()<<"keyboard.sh");
其中keyboard.sh文件运行matchbox-keyboard命令以使键盘显示在屏幕上。 当QLineEdit成为焦点时,键盘确实会在屏幕上弹出。焦点不清晰时,我无法消失。
解决方法
还没有测试过,但是我的想法是从QLineEdit派生并发出类似focusGotten
和focusLost
的信号(名字来自我的头顶,随意使用您喜欢的任何名称)相应地(例如,从focus[In|Out]Event
开始),以便他们可以在子进程上(连接到这些插槽时)调用kill
或terminate
。
没有“ 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();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。