问题描述
我正在使用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();
}
}