屏幕键盘显示/隐藏

时间:2013-09-24 05:27:44

标签: qt user-interface qtextedit qlineedit on-screen-keyboard

我想要什么
我使用简单的QPushButtons和QFrame制作屏幕键盘。我想要的是,当输入小部件(QLineEdit,QTextEdit,QPlainText,QSpinBox)聚焦时,我的屏幕键盘将显示,当没有输入小部件聚焦时,键盘将自动隐藏。我应该这样做吗?

我的Approch
我为QLineEdit.QTextEdit,QPlainEdit,QSpinBox中的每一个扩展了seprate类。然后我在focusIn和focusOut事件上实现了键盘显示/隐藏。但是它会导致问题。

问题
当窗体上有两个输入窗口小部件时。当我点击第一个窗口小部件键盘时会出现(很好)。当我点击第二个输入窗口小部件键盘隐藏时(由于第一个输入窗口小部件的focusOut:这是问题)。我该怎么做?如果我必须继续这个approch

1 个答案:

答案 0 :(得分: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,则另一个输入窗口小部件具有焦点,因此只需停止计时器,就不需要隐藏键盘。