如果您展示了一些代码来说明您如何解决您的解决方案,这将有所帮助,所以如果我正在描述您已经在做的事情,请原谅。
您扩展的每个类都是一个 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,则另一个输入小部件具有焦点,因此只需停止计时器,无需隐藏键盘。