軟鍵盤通過將多個(gè)ToolButton放在一個(gè)Widget當(dāng)中,,并將按鈕提升為自定義類softKey繼承于QToolButton類,。
步驟: 1、為需要使用到軟鍵盤的控件添加事件過濾器
//添加事件過濾器
ui->account_lineEdit->installEventFilter(this);
ui->password_lineEdit->installEventFilter(this);
//先隱藏軟鍵盤
ui->widget->hide();
2,、重寫eventFilter事件,,判斷當(dāng)前觸發(fā)對(duì)象是否是添加了過濾器的控件,且事件是否是鼠標(biāo)按鈕點(diǎn)擊事件,。是的話,,顯示軟鍵盤,,并將焦點(diǎn)設(shè)置到當(dāng)前控件上。
bool MainWindow::eventFilter(QObject *obj,QEvent *event)
{
if(obj == ui->account_lineEdit && event->type() == QEvent::MouseButtonPress)
{
ui->widget->show(); //顯示軟鍵盤
ui->account_lineEdit->setFocus(); //設(shè)置焦點(diǎn)
}
else if(obj == ui->password_lineEdit && event->type() == QEvent::MouseButtonPress)
{
ui->widget->show();
ui->password_lineEdit->setFocus();
}
return QMainWindow::eventFilter(obj,event);
}
3,、若是當(dāng)前控件編輯完畢則隱藏軟鍵盤
//賬號(hào)輸入完畢
void MainWindow::on_account_lineEdit_editingFinished()
{
ui->widget->hide();
}
//密碼輸入完畢
void MainWindow::on_password_lineEdit_editingFinished()
{
ui->widget->hide();
}
4,、在自定義按鈕類softKey的槽函數(shù)中判斷當(dāng)前點(diǎn)擊的按鈕文本,定義一個(gè)按鍵事件,,通過postEvent將事件key發(fā)送出去
#include "softkey.h"
softKey::softKey(QWidget *parent):QToolButton(parent)
{
//為按鈕設(shè)置統(tǒng)一樣式
QFile qssFile(":/qss/qss.qss");
if(qssFile.open(QIODevice::ReadOnly))
qApp->setStyleSheet(qssFile.readAll());
connect(this,SIGNAL(clicked(bool)),this,SLOT(echoClicked(bool)));
}
void softKey::echoClicked(bool)
{
if(this->text() == "backspace")
{
//定義一個(gè)事件,,Key_Backspace撤消按鈕
QKeyEvent *key = new QKeyEvent(QEvent::KeyPress,Qt::Key_Backspace,Qt::NoModifier);
//通過postEvent將事件key發(fā)送出去
QApplication::postEvent(QApplication::focusWidget(),key);
}
else if(this->text() == "enter")
{
QKeyEvent *key = new QKeyEvent(QEvent::KeyPress,Qt::Key_Enter,Qt::NoModifier);
QApplication::postEvent(QApplication::focusWidget(),key);
}
else if(this->text().isEmpty())
{
QKeyEvent *key = new QKeyEvent(QEvent::KeyPress,Qt::Key_Space,Qt::NoModifier);
QApplication::postEvent(QApplication::focusWidget(),key);
}
else if(this->text() == "shift")
{
QKeyEvent *key = new QKeyEvent(QEvent::KeyPress,Qt::Key_Shift,Qt::NoModifier);
QApplication::postEvent(QApplication::focusWidget(),key);
}
else if(this->text() == "ctrl")
{
QKeyEvent *key = new QKeyEvent(QEvent::KeyPress,Qt::Key_Control,Qt::NoModifier);
QApplication::postEvent(QApplication::focusWidget(),key);
}
else if(this->text() == "tab")
{
QKeyEvent *key = new QKeyEvent(QEvent::KeyPress,Qt::Key_Tab,Qt::NoModifier);
QApplication::postEvent(QApplication::focusWidget(),key);
}
else if(this->text() == "alt")
{
QKeyEvent *key = new QKeyEvent(QEvent::KeyPress,Qt::Key_Alt,Qt::NoModifier);
QApplication::postEvent(QApplication::focusWidget(),key);
}
else
{
QKeyEvent *key = new QKeyEvent(QEvent::KeyPress,'w',Qt::NoModifier,this->text());
//通過postEvent將事件key的文本內(nèi)容發(fā)送出去,QApplication::focusWidget()當(dāng)前窗口中,,有光標(biāo)的控件上
QApplication::postEvent(QApplication::focusWidget(),key);
}
}
效果圖:
(ctrl鍵,、alt鍵、空格鍵,、shift鍵功能未實(shí)現(xiàn))
|