Qt软键盘使用

本文介绍了在Qt下使用软键盘的方法,主要分析了QKeyTools库和QInputMethod组件。QKeyTools提供了源码,方便自定义按键,但存在对汉字支持有限和不支持方向键的问题。而QInputMethod虽然支持多种语言,但占空间大,不支持调整大小及方向键。文章提出了这两个方案在实际应用中的优缺点,并给出了示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

公司设备采用触摸屏,要求程序中采用软键盘来输入文本,于是开始探索如何使用软键盘。由于公司采用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值