我想要什么我使用简单的QPushButtons和QFrame制作了屏幕键盘。我想要的是,当输入小部件(QLineEdit,QTextEdit,QPlainText,QSpinBox)处于焦点时,我的屏幕键盘将显示,而当没有输入小部件处于焦点时,我的键盘将自动隐藏。
我该怎么办?
我的方法我为QLineEdit,QTextEdit,QPlainEdit,QSpinBox扩展了单独的类。然后,我在他们的focusIn和focusOut事件上实现了键盘显示/隐藏。但这会引起问题。
问题当表单上有两个Input小部件时,当我单击第一个小部件时,键盘就会出现(很好)。当我单击第二个输入窗口小部件时,第一个输入窗口小部件的focusOut导致键盘隐藏(此问题)。
我必须继续这种方法。我该怎么办?
如果您显示了有关解决方案的代码,这将有所帮助,请原谅我在描述您已经在做的事情。
您扩展的每个类都是一个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,则另一个输入小部件具有焦点,因此只需停止计时器即可,而无需隐藏键盘。