屏幕键盘显示/隐藏

问题描述 投票:0回答:1

我想要什么我使用简单的QPushButtons和QFrame制作了屏幕键盘。我想要的是,当输入小部件(QLineEdit,QTextEdit,QPlainText,QSpinBox)处于焦点时,我的屏幕键盘将显示,而当没有输入小部件处于焦点时,我的键盘将自动隐藏。

我该怎么办?

我的方法我为QLineEdit,QTextEdit,QPlainEdit,QSpinBox扩展了单独的类。然后,我在他们的focusIn和focusOut事件上实现了键盘显示/隐藏。但这会引起问题。

问题当表单上有两个Input小部件时,当我单击第一个小部件时,键盘就会出现(很好)。当我单击第二个输入窗口小部件时,第一个输入窗口小部件的focusOut导致键盘隐藏(此问题)。

我必须继续这种方法。我该怎么办?

qt user-interface qtextedit qlineedit on-screen-keyboard
1个回答
0
投票

如果您显示了有关解决方案的代码,这将有所帮助,请原谅我在描述您已经在做的事情。

您扩展的每个类都是一个QWidget,它继承了QObject。 QObject的一个有用功能是能够安装事件过滤器。这是一个对象,它将在安装对象之前接收事件,并且可以选择处理这些事件,或将其传递给原始对象。

如果仅扩展输入窗口小部件以处理显示和禁用键盘事件,建议您将其更改为使用事件处理程序。

这里是如何创建一个示例:-

class MyEventHandler : public QObject
{
    Q_OBJECT

    public:
         MyEventHandler(QObject* parent);

    protected:
         bool eventFilter(QObject *obj, QEvent *event);
};

bool MyEventHandler::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type == QEvent::FocusAboutToChange) // May need QEvent::FocusIn or QEvent::FocusOut
    {
        // handle on-screen keyboard
    }
}

然后,您可以对每个输入窗口小部件使用相同的事件过滤器;例如QLineEdit和QSpinBox:-

MyEventHandler* theEventHandler = new MyEventHandler(this);
lineEdit->installEventFilter(theEventHandler);
spinBox->installEventFilter(theEventHandler);

由于两个输入小部件都使用相同的事件处理程序,因此它也可以用于存储键盘的状态;显示或隐藏。如果将计时器添加到focusOut且在短时间内未调用focusIn,则您会知道输入小部件失去了焦点,因此可以隐藏键盘。如果在计时器到期之前调用focusIn,则另一个输入小部件具有焦点,因此只需停止计时器即可,而无需隐藏键盘。

© www.soinside.com 2019 - 2024. All rights reserved.