2013-07-12 96 views
0

基於here示例,我在輸入面板小部件中實現了虛擬鍵盤。我可以通過發送像emit characterGenerated(char)這樣的信號在文本小部件中顯示字符 - 請參閱example中的buttonClicked(QWidget *w)方法。不幸的是,這種方法不適用於輸入和退格鍵。我會很感激建議可能的解決方法。在Qt虛擬鍵盤上實現Backspace並輸入密鑰

如果很重要,我正在用C++進行開發。

回答

2

考慮鏈接示例中的MyInputPanelContext::sendCharacter函數。當構建QKeyEvent keyPress對象時,將character.unicode()用作第二個參數。但是,您也可以使用Qt::Key值作爲第二個參數。例如:

QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier); 

你應該重寫這個方法來接受int參數將被傳遞到QKeyEvent構造和改變characterGenerated(QChar)信號keyGenerated(int)這樣你就可以發送一個特殊鍵(Qt::Key_Backspace)或字符鍵(character.unicode())使用相同的信號和插槽。

+0

謝謝。不幸的是,我不太清楚如何使這種技術適用於沒有Qt Key的歐元符號等字符。 – Olumide

+0

我的解決方法基本上是測試字符,如果按下Enter或Backspace鍵,則用'Qt :: Key_Enter'或'Qt :: Key_Backspace'引發一個事件。否則用字符unicode信息引發一個事件。 – Olumide

0

這是一個特定的例子。我通過修改發送字符碼(在myinputpanelcontext.cpp中)來將'*'按鈕變回退格。請看一看。希望能幫助到你。

void MyInputPanelContext::sendCharacter(QChar character) 
{ 
QPointer<QWidget> w = focusWidget(); 

if (!w) 
    return; 


QKeyEvent keyPress(QEvent::KeyPress, character.unicode(), Qt::NoModifier, QString(character)); 
QKeyEvent keybkspc(QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier); 
if(character != '*') 
{ 
    QApplication::sendEvent(w, &keyPress); 
} 
else 
{ 
    QApplication::sendEvent(w, &keybkspc); 
} 
if (!w) 
    return; 

QKeyEvent keyRelease(QEvent::KeyPress, character.unicode(), Qt::NoModifier, QString()); 
QApplication::sendEvent(w, &keyRelease); 
}