0

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

我该怎么办?

我的
方法我为每个 QLineEdit.、QTextEdit、QPlainEdit、QSpinBox 扩展了单独的类。然后我在他们的 focusIn 和 focusOut 事件上实现了键盘显示/隐藏。但它会导致一个问题。

问题
当表单上有两个输入小部件时,当我点击第一个小部件时,键盘会出现(很好)。当我单击第二个输入小部件时,由于第一个输入小部件的 focusOut 键盘隐藏(这是问题)。

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

4

1 回答 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,则另一个输入小部件具有焦点,因此只需停止计时器,无需隐藏键盘。

于 2013-09-24T08:10:35.020 回答