Qt自带的虚拟键盘--悬浮键盘

Qt自带的虚拟键盘

qt从是带有虚拟键盘的,对于触屏软件来说,有时候用还是要用虚拟键盘的。

这个是qt的虚拟键盘。只要在对应的增加程序之前配置这个环境就可以直接用了。

cpp 复制代码
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
cpp 复制代码
int main(int argc, char *argv[])
{
    qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

屏蔽虚拟键盘

需求:有些简单的输入框有对应的数字键盘不想弹出虚拟键盘。可以重写输入控件。

cpp 复制代码
class NoVirtualKeyboardLineEdit : public QLineEdit
{
    Q_OBJECT
public:
    using QLineEdit::QLineEdit;
protected:
     void mouseReleaseEvent(QMouseEvent *event) override
    {
         QLineEdit::mouseReleaseEvent(event);
         QInputMethod *im = QGuiApplication::inputMethod();
         if (im && im->isVisible()) {
             im->hide();
         }
    }
};

对应就是让虚拟键盘隐藏就可以,在需要用的地方用这个控件就可以了。

悬浮键盘

需求:qt自带的虚拟键盘,显示出来的时候会占屏幕的下边,又时候根本不想要,想要键盘可以悬浮的效果,不遮挡东西。还可以移动。

修改了为悬浮显示,语言修改只保留了中文和英文的,可以移动上面的标题栏移动键盘,切换到其他地方能自动的隐藏。总体用起来还是不错的。

代码

.h

cpp 复制代码
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    QQuickWidget *m_keyboardWidget;
    //QQuickWindow *m_keyboardWidget;
    QQuickView* m_keyboardView;
    QLineEdit *m_testInput;

private:
    void creatInitByQmlAppEngine();
};

.cpp文件

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QVBoxLayout>
#include <QDebug>
#include <QQmlApplicationEngine>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_keyboardWidget(nullptr)
{
    ui->setupUi(this); // 如果用了.ui文件

    QWidget *central = new QWidget(this);
    QVBoxLayout *layout = new QVBoxLayout(central);

    m_testInput = new QLineEdit(this);
    m_testInput->setPlaceholderText("点击这里,悬浮键盘会出现...");
    m_testInput->setMinimumHeight(40);
    layout->addWidget(m_testInput);


    NoVirtualKeyboardLineEdit* m_testInput = new NoVirtualKeyboardLineEdit(this);
    m_testInput->setPlaceholderText("悬浮键盘不会出现...");
    m_testInput->setMinimumHeight(40);
    layout->addWidget(m_testInput);


    for(int i=0;i<10;i++)
    {
        QPushButton* btn = new QPushButton(QString::number(i),this);
        layout->addWidget(btn);
    }

    layout->addStretch(); // 添加伸缩项,把输入框推到顶部
    this->setCentralWidget(central);
    creatInitByQmlAppEngine();

    // 设置窗口标题和大小
    this->setWindowTitle("Qt悬浮键盘测试程序");
    this->resize(1000, 600);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::creatInitByQmlAppEngine()
{
    //QQmlApplicationEngine该类结合了QQmlEngine 和QQmlComponent ,为加载单个 QML 文件提供了便捷的方法。
    //与QQuickView 不同,QQmlApplicationEngine 不会自动创建根窗口。如果要使用Qt Quick 中的可视化项目,则需要将它们放在Window 中。
    //QList<QObject *> QQmlApplicationEngine::rootObjects() const//返回由QQmlApplicationEngine 实例化的所有根对象的列表。


    // QQmlApplicationEngine *engine = new QQmlApplicationEngine;
    // 可选:监听加载完成/失败信号(调试必备)
    // QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
    //                  &app, [qmlUrl](QObject *obj, const QUrl &objUrl) {
    //                      if (!obj && qmlUrl == objUrl) {
    //                          qCritical() << "QML加载失败:" << qmlUrl;
    //                          QCoreApplication::exit(-1); // 加载失败退出
    //                      }
    //                  }, Qt::QueuedConnection);
    // engine->load(QUrl("qrc:/qml/FloatingKeyboard1.qml"));

    //可以同时加载多个qml文件
    QQmlApplicationEngine* engine = new QQmlApplicationEngine("qrc:/qml/FloatingKeyboard3.qml");
    engine->load("qrc:/qml/FloatingKeyboard1.qml");
    engine->load("qrc:/qml/FloatingKeyboard2.qml");

    for(auto elem : engine->rootObjects())
    {
        qDebug()<<"load:"<<elem;
    }
}
相关推荐
sycmancia9 小时前
Qt——编辑交互功能的实现
开发语言·qt
qq_4017004114 小时前
Qt 项目中使用 QSS 的全面总结
开发语言·qt
小短腿的代码世界15 小时前
信号路由风暴:Qt算法交易系统的高频信号分发架构
qt·算法·架构
郝学胜-神的一滴17 小时前
Qt 高级开发 010: 从跨界面传值到自定义信号
开发语言·c++·qt·程序人生·用户界面
Hua-Jay21 小时前
OpenCV联合C++/Qt 学习笔记(二十三)----图像校正及单目位姿估计
c++·笔记·qt·opencv·学习·计算机视觉
mirror_zAI21 小时前
C++ 仿 QQ 聊天室项目:Qt 客户端 + epoll 服务端 + Reactor 架构(含源码)
c++·qt·架构
Hua-Jay1 天前
OpenCV联合C++/Qt 学习笔记(二十四)----差值法检测移动物体、稠密光流法跟踪移动物体及稀疏光流法跟踪移动物体
c++·笔记·qt·opencv·学习·计算机视觉
我在人间贩卖青春1 天前
重学Qt——对话框和多窗口程序设计
qt
努力努力再努力wz1 天前
【QT入门系列】QWidget 六大常用属性详解:windowOpacity、cursor、font、focus、toolTip 与 styleSheet
android·开发语言·数据结构·c++·qt·mysql·算法
程序leo源2 天前
Qt窗口详解
开发语言·数据库·c++·qt·青少年编程·c#