Это поможет, если бы вы указали какой-то код для того, как вы пошли о своем решении, поэтому извините меня, если я расскажу, что вы уже делаете.
Каждый из классов, которые вы расширили, является 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