2013-09-24 158 views
0

我想要什麼
我用簡單的QPushButtons和QFrame.What我想,當輸入小部件(QLineEdit的,的QTextEdit,QPlainText,QSpinBox)是專注我的屏幕鍵盤將顯示由屏幕上的鍵盤當沒有輸入小部件在焦點時,鍵盤會自動隱藏。我該怎麼做?屏幕鍵盤顯示/隱藏

我的計算策略
我伸出每個QLineEdit.QTextEdit,QPlainEdit,QSpinBox.then我實施了thier的focusIn鍵盤顯示/隱藏和事件的內容event.But它會導致問題的seprate類。

問題
當有兩個上form.When我第一插件鍵盤上點擊將川方(即細)。當我在第二輸入插件鍵盤獸皮點擊(由於第一輸入窗口小部件的事件的內容輸入窗口小部件:這是問題)。我應該爲此做些什麼?如果我必須繼續處理這個問題

+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