问题
公司设备采用触摸屏,要求程序中采用软键盘来输入文本,于是开始探索如何使用软键盘。由于公司采用Qt开发设备程序,于是问题就成了“如何在Qt下使用软键盘?”
分析
在网上搜索解决方案,大体有两种思路:1)开发软键盘界面程序,该程序以dll库封装,主程序中使用该dll;可参考QKeyTools; 2)使用本身提供的QInputMethod来调用软键盘;参考Virtual keyboard or onscreen keyboard for QtWidgets applications。
QKeyTools
https://github.com/wodelover/QKeyTools包含源码和调用示例
QKeyTools源码
QKeyTools.pro
QT += gui sql widgets
TARGET = QkeyTools
TEMPLATE = lib
DEFINES += QKEYTOOLS_LIBRARY
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
qkeytools.cpp
HEADERS += \
qkeytools.h \
qkeytools_global.h
unix {
target.path = /usr/lib
INSTALLS += target
}
FORMS += \
qkeytools.ui
qkeytools.h
#ifndef QKEYTOOLS_H
#define QKEYTOOLS_H
#include "qkeytools_global.h"
#include <QWidget>
#include <QMouseEvent>
#include <QLabel>
#include <QLineEdit>
#include <QTextEdit>
#include <QPlainTextEdit>
#include <QTextBrowser>
#include <QtSql>
#include <QPushButton>
#include <QTimer>
#include <QPropertyAnimation>
#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
#include <QDesktopWidget>
#endif
#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
#define nullptr 0
#endif
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
#include <QScreen>
#endif
// define Animation Run time
const qint16 AnimationTime = 50;
namespace Ui {
class QkeyTools;
}
class QKEYTOOLSSHARED_EXPORT QkeyTools : public QWidget
{
Q_OBJECT
#if (QT_VERSION >= QT_VERSION_CHECK(5,7,0))
Q_PROPERTY(qint8 position READ position WRITE setPosition NOTIFY positionChanged)
Q_PROPERTY(qint8 style READ style WRITE setStyle NOTIFY styleChanged)
Q_PROPERTY(qint8 fontSize READ btnFontSize WRITE setBtnFontSize NOTIFY btnFontSizeChanged)
Q_PROPERTY(qint8 labSize READ labSize WRITE setLabSize NOTIFY labSizeChanged)
Q_PROPERTY(quint16 width READ width WRITE setWidth NOTIFY widthChanged)
Q_PROPERTY(quint16 height READ height WRITE setHeight NOTIFY heightChanged)
Q_PROPERTY(quint16 mainwindowOffset READ mainwindowOffset WRITE setMainwindowOffset NOTIFY mainwindowOffsetChanged)
Q_PROPERTY(QString candidateWordsPath READ candidateWordsPath WRITE setCandidateWordsPath NOTIFY candidateWordsPathChanged)
Q_PROPERTY(Language currentLanguage READ currentLanguage WRITE setCurrentLanguage NOTIFY currentLanguageChanged)
#endif
public:
~QkeyTools();
enum Language {
English,
Capital,
Chinese,
Chinese_TW,
Chinese_HK
};
Q_ENUM(Language)
enum Position {
UnderWidget, // 显示位置在控件的下方
ScreenCenter, // 居中显示
ScreenBottom, // 屏幕底部
ProcessBottom, // 应用程序下方
Embedded // 同主程序显示位置对齐,嵌入式平台尽量设置此方式
};
Q_ENUM(Position)
enum Style {
BLUE = 0, //淡蓝色
DEV, //dev风格
BLACK, //黑色
BROWN, //灰黑色
LIGHTGRAY, //浅灰色
DARKGRAY, //深灰色
GRAY, //灰色
LIGHTYELLOW //浅黄色
};
Q_ENUM(Style)
static QkeyTools *getInstance();
Q_INVOKABLE void Init(QkeyTools::Position position, QkeyTools::Style style, qint8 btnFontSize, qint8 labFontSize);
// 设置键盘显示位置
Q_INVOKABLE void setPosition(qint8 position);
Q_INVOKABLE Position position();
// 设置键盘颜色样式
Q_INVOKABLE void setStyle(qint8 style);
Q_INVOKABLE Style style();
// 设置按钮字体的大小
Q_INVOKABLE void setBtnFontSize(qint8 size);
Q_INVOKABLE qint8 btnFontSize();
// 设置待选字的大小
Q_INVOKABLE void setLabSize(qint8 size);
Q_INVOKABLE qint8 labSize();
// 设置键盘的宽度
Q_INVOKABLE void setWidth(quint16 width);
Q_INVOKABLE quint16 width();
// 设置键盘的高度
Q_INVOKABLE void setHeight(quint16 height);
Q_INVOKABLE quint16 height();
// 设置输入法方式
Q_INVOKABLE void setCurrentLanguage(Language language);
Q_INVOKABLE Language currentLanguage();
// 设置中文字库的路径
Q_INVOKABLE void setCandidateWordsPath(QString path);
Q_INVOKABLE QString candidateWordsPath();
// 设置主窗口和软键盘的相对距离
Q_INVOKABLE void setMainwindowOffset(quint16 offset);
Q_INVOKABLE quint16 mainwindowOffset();
/**
* @name: setMainWindowObject
* @descption: 用于键盘BOTTOMTOP方式显示时使用
* 通过此函数可以实现键盘把主窗口位置往上移动
* @author: zhangh
* @date: 2019-05-14
* @param: [QObject] obj 主窗口对象
*/
void setMainWindowObject(QWidget *obj);
signals:
void positionChanged(qint8 position);
void styleChanged(qint8 style);
void btnFontSizeChanged(qint8 size);
void labSizeChanged(qint8 size);
void widthChanged(quint16 width);
void heightChanged(quint16 height);
void currentLanguageChanged(Language language);
void mainwindowOffsetChanged(quint16 offset);
void candidateWordsPathChanged(QString candidateWordsPath);
protected:
//事件过滤器,处理鼠标在汉字标签处单击操作
virtual bool eventFilter(QObject *obj, QEvent *event) override;
virtual void mouseMoveEvent(QMouseEvent *e) override;
virtual void mousePressEvent(QMouseEvent *e) override;
virtual void mouseReleaseEvent(QMouseEvent *e) override;
virtual void showEvent(QShowEvent *event) override;
private slots:
//焦点改变事件槽函数处理
void focusChanged(QWidget *oldWidget, QWidget *nowWidget);
//输入法面板按键处理
void handleButtonClicked();
//定时器处理退格键
void reClicked();
void keyAnimationFinished();
vo