QT自定义空间之软键盘
- 1.功能列表
- 2.效果
- 2.1 中文键盘&汉字输入
- 2.2 英文输入法
- 2.3 数字键盘
- 2.4 数据键盘效果
- 3.部分代码
- 3.1 汉字输入
- 3.2 切换数字键盘
- 3.3 键盘显示&隐藏
- 3.4 控件提升
- 3.5样式设置
- 3.6 使用QLineEditAllKeyBoard 控件
1.功能列表
- 支持中文输入法
- 支持引文输入
- 支持数字键盘
- 支持中文/英文/数字软键盘切换
2.效果
2.1 中文键盘&汉字输入
2.2 英文输入法
2.3 数字键盘
2.4 数据键盘效果
3.部分代码
3.1 汉字输入
基于googlepingyin输入
void KeyboardForm::displayHanzi()
{
if (m_hanziPageCnt <= 0)
{
m_listHanzi[0]->setEnabled(false);
m_listHanzi[hanziCandidate-1]->setEnabled(false);
for (int i = 0; i < hanziCandidate-2; i++)
{
m_listHanzi[i+1]->setText("");
m_listHanzi[i+1]->setEnabled(false);
}
}
else if (m_hanziPageCnt == 1)
{
m_listHanzi[0]->setEnabled(false);
m_listHanzi[hanziCandidate-1]->setEnabled(false);
int len = m_pinyin.HanziModel.size();
for (int i = 0; i < len; i++)
{
m_listHanzi[i+1]->setText(m_pinyin.HanziModel[i]);
m_listHanzi[i+1]->setEnabled(true);
}
for (int i = len; i < hanziCandidate-2; i++)
{
m_listHanzi[i+1]->setText("");
m_listHanzi[i+1]->setEnabled(false);
}
}
else if (m_curHanziPage == 1)
{
m_listHanzi[0]->setEnabled(false);
m_listHanzi[hanziCandidate-1]->setEnabled(true);
for (int i = 0; i < hanziCandidate-2; i++)
{
m_listHanzi[i+1]->hide();
m_listHanzi[i+1]->setText(m_pinyin.HanziModel[i]);
m_listHanzi[i+1]->setEnabled(true);
m_listHanzi[i+1]->show();
}
}
else if (m_curHanziPage == m_hanziPageCnt)
{
m_listHanzi[0]->setEnabled(true);
m_listHanzi[hanziCandidate-1]->setEnabled(false);
qDebug() << m_pinyin.HanziModel << m_pinyin.HanziModel.size();
int len = m_pinyin.HanziModel.size() % (hanziCandidate-2);
int idx = (m_hanziPageCnt - 1) * (hanziCandidate-2);
if (len == 0)
{
len = hanziCandidate-2;
}
for (int i = 0; i < len; i++)
{
m_listHanzi[i+1]->setText(m_pinyin.HanziModel[idx + i]);
m_listHanzi[i+1]->setEnabled(true);
}
for (int i = len; i < hanziCandidate-2; i++)
{
m_listHanzi[i+1]->setText("");
m_listHanzi[i+1]->setEnabled(false);
}
}
else
{
m_listHanzi[0]->setEnabled(true);
m_listHanzi[hanziCandidate-1]->setEnabled(true);
int idx = (m_curHanziPage - 1) * (hanziCandidate-2);
for (int i = 0; i < hanziCandidate-2; i++)
{
m_listHanzi[i+1]->setText(m_pinyin.HanziModel[idx + i]);
m_listHanzi[i+1]->setEnabled(true);
}
}
}
3.2 切换数字键盘
void KeyboardForm::changeSymbol()
{
if (m_btnSymbol->text() == ".?123")
{
m_btnSymbol->setText("返回");
// 输出已有的字母
sendKeyToFocusItem(m_cachePinYin);
m_hanziPageCnt = 0;
m_labPyText->clear();
m_cachePinYin.clear();
displayHanzi();
m_shiftKey = false;
m_inputMode = ImNum;
m_btnChange->setIconSize(QSize(0,0));
m_btnChange->setText("数字");
for (int i = 0; i < m_listCharsBtns.size(); i++)
{
m_listCharsBtns[i]->setText(kbSymbol[i] == '&' ? "&&" : QString(QLatin1Char(kbSymbol[i])));
}
}
else
{
m_btnSymbol->setText(".?123");
m_inputMode = (InputMode)m_btnChange->property("Mode").toInt();
QIcon btn_icon;
btn_icon.addFile(m_inputMode == ImCn ? ":/image/chinese.png":":/image/english.png");
m_btnChange->setIcon(btn_icon);
m_btnChange->setIconSize(QSize(70, 70));
m_btnChange->setText("");
// m_btnChange->setText(m_inputMode == ImCn ? "中/英" : "中/英");
for (int i = 0; i < m_listCharsBtns.size(); i++)
{
m_listCharsBtns[i]->setText(QString(QLatin1Char(kbLetter[i])));
}
}
}
3.3 键盘显示&隐藏
显示键盘输入法
void InputContext::showInputPanel()
{
if (!d->KeyBoard)
{
d->KeyBoard = new KeyboardForm();
connect(d->KeyBoard, SIGNAL(sendKeyToFocusItem(QString)), &d->keyEventDispatcher, SLOT(sendKeyToFocusItem(QString)));
}
d->KeyBoard->show();
d->KeyBoard->move(d->KeyBoard->x(), WINDOW_HEIGHT - d->KeyBoard->height());
QPlatformInputContext::showInputPanel();
}
隐藏键盘输入法
void InputContext::hideInputPanel()
{
if (d->KeyBoard)
{
d->KeyBoard->hide();
}
QPlatformInputContext::hideInputPanel();
}
3.4 控件提升
重写QLineEdit控件
class QLineEditAllKeyBoard : public QLineEdit
{
Q_OBJECT
public:
explicit QLineEditAllKeyBoard(QWidget *parent = nullptr);
private:
InputContext *pInputContext;
signals:
public slots:
protected:
virtual void mousePressEvent(QMouseEvent *event);
};
3.5样式设置
设置整体样式,包含按钮,面板
setStyleSheet("QWidget{background:#191919;color:#FFFFFF;}"
"QPushButton{background-color: #313131; border-width: 5; font: normal;border:1px #313131;color:#FFFFFF;border-radius:1px;padding:1px 2px;} "
"QPushButton:hover{background-color: #00B2DB; border-width: 5;}"
"QPushButton:pressed{background-color: #00B2DB; border-width: 5;}");
3.6 使用QLineEditAllKeyBoard 控件
提升UI中的QLineEdit控件为QLineEditAllKeyBoard