2013-09-24 4 views
0

Я хочу
я сделал экранную клавиатуру с помощью простой кнопки QPushButton и QFrame.What я хочу, когда входной виджет (QLineEdit, QTextEdit, QPlainText, QSpinBox) находится в фокусе моей экранной клавиатуры покажет и когда входной виджет не находится в фокусе, клавиатура автоматически скроется. Что я должен сделать для этого?Экранной клавиатура Show/Hide

Моего Approch
I расширяет seprate класса для каждого из QLineEdit.QTextEdit, QPlainEdit, QSpinBox.then я реализованная клавиатуру показать/скрыть на тир focusIn и focusOut event.But это может вызвать проблемы.

Проблема
, когда есть два ввод виджет на form.When я нажимаю на первом виджет клавиатуре comeup (это хорошо) .when я нажимаю на вторых шкурах входного виджета клавиатуры (из-за focusOut первого входного виджета : ЭТО ПРОБЛЕМА). Что я должен делать для этого? если я должен приступить к этому утверждению

+0

Возможно, вам нужно [QApplication :: focusChanged] (http://qt-project.org/doc/qt-5.0/qtwidgets/qapplication.html#focusChanged). – thuga

ответ

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

+0

спасибо за ответ, я использовал QApplication :: focusChanged (QWidget *, QWidget *); чтобы справиться с этим. – Jai

 Смежные вопросы

  • Нет связанных вопросов^_^