找回密码
 立即注册
Qt开源社区 门户 查看内容

轻量级Qt键盘-中文输入

2019-9-23 10:13| 发布者: admin| 查看: 1206| 评论: 0

摘要: 在原有的键盘基础上新增中文输入功能。中文候选栏  中文输入候选栏ChineseWidget使用QListWidget和样式表实现:setText输入对应拼音字母,即会加载符合的拼音中文。pressedChanged信号函数即为当按键按下,传递对 ...

在原有的键盘基础上新增中文输入功能。




中文候选栏

  中文输入候选栏ChineseWidget使用QListWidget和样式表实现:
setText输入对应拼音字母,即会加载符合的拼音中文。
pressedChanged信号函数即为当按键按下,传递对应的中文。
class ChineseWidget:public QListWidget {
Q_OBJECT
public:
ChineseWidget(QWidget *parent =NULL);
void setText(const QString &text);

signals:
void pressedChanged(constint&code,const QString &text);
...
};
  设置QListWidget:setFocusPolicy(Qt::NoFocus);
/* 设置为列表显示模式 */
setViewMode(QListView::ListMode);

/* 从左往右排列 */
setFlow(QListView::LeftToRight);

/* 屏蔽水平滑动条 */
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

/* 屏蔽垂直滑动条 */
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

/* 设置为像素滚动 */
setHorizontalScrollMode(QListWidget::ScrollPerPixel);

/* 设置鼠标左键拖动 */
QScroller::grabGesture(this, QScroller::LeftMouseButtonGesture);

/* 设置样式 */
setStyleSheet(R"(
QListWidget { outline: none; border:1px solid #00000000; color: black; }
QListWidget::Item { width: 50px; height: 50px; }
QListWidget::Item:hover { background: #4395ff; color: white; }
QListWidget::item:selected { background: #4395ff; color: black; }
QListWidget::item:selected:!active { background: #00000000; color: black; }
)");

加载中文字库


  字库加载在QMap<QString, QList<QPair<QString, QString>> >容器中。
QFile pinyin(":/ChineseLib/PinYin");
if (! pinyin.open(QIODevice::ReadOnly)){
qDebug()<<"Open pinyin file failed!";
return;
}

while (! pinyin.atEnd()){
QString buf = QString::fromUtf8(pinyin.readLine()).trimmed();
QRegExp regExp("^[\u4E00-\u9FA5]+");

int index = regExp.indexIn(buf);
if (index ==-1)
continue;

QString first = buf.right(buf.size()- regExp.matchedLength());// 分离拼音字母
QString second = buf.mid(index, regExp.matchedLength());// 分离中文

QList<QPair<QString, QString>>&tmp = m_data[first.left(1)];// 取首字母做索引
tmp.append(qMakePair(first, second));
}

  部分字库内容预览:
安a
按a
爱a
阿a
暗a
啊a
埃a
碍a
凹a
奥a
岸a
矮a
案a
俺a

匹配符合拼音的中文


  取拼音首字母索引,再匹配中文。
const QList<QPair<QString, QString>>&tmp = m_data[text.left(1)];
for (const QPair<QString, QString>&each : tmp){
if (each.first != text)// 匹配是否符合的在容器里面拼音
continue;

addOneItem(each.second);
}

关于更多


1. 轻量级Qt键盘-介绍篇

2. 通过索引优化查找性能

3. 公众号后台回复『Qt键盘』获取往期推送文章。

----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:Qt君,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

1人点赞鲜花

握手

雷人

路过

鸡蛋

刚表态过的朋友 (1 人)


公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了