如果你已經展示了一些關於你的解決方案的代碼,這將有所幫助,所以如果我正在描述你已經在做什麼,不好意思。
您擴展的每個類都是一個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,則另一個輸入窗口小部件具有焦點,所以只需停止定時器,並且不需要隱藏鍵盤。
也許你需要的是[QApplication :: focusChanged](http://qt-project.org/doc/qt-5.0/qtwidgets/qapplication.html#focusChanged)。 – thuga