共计 1880 个字符,预计需要花费 5 分钟才能阅读完成。
在原有的键盘基础上新增中文输入功能。
中文候选栏
中文输入候选栏 ChineseWidget
使用 QListWidget 和样式表实现:
setText
输入对应拼音字母,即会加载符合的拼音中文。pressedChanged
信号函数即为当按键按下,传递对应的中文。
class ChineseWidget : public QListWidget {
Q_OBJECT
public:
ChineseWidget(QWidget *parent = NULL);
void setText(const QString &text);
signals:
void pressedChanged(const int &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);
}
关于更多
- 轻量级 Qt 键盘 - 介绍篇
- 通过索引优化查找性能
- 公众号 Qt 君后台回复『Qt 键盘』获取往期推送文章。
正文完