目录
一、环境与目标
二、Qt VirtualKeyboard
1.勾选Qt VirtualKeyboard
2.ui设计流程
3.注意事项及问题点
三、参考代码
参考博客
一、环境与目标
qt版本:5.12.7
windows 11 下的 Qt Designer (已搭建)
目标:创建一个窗口,在窗口创建按钮,点击按钮弹出弹窗,弹窗有文本输入框,点击文本输入框弹出qt 自带的官方键盘,通过键盘输入文本至输入框。
二、Qt VirtualKeyboard
Qt VirtualKeyboard 是一个基于 Qt 的虚拟键盘库,它允许开发者在没有物理键盘的设备上通过触摸屏或其他输入设备实现键盘输入,想要使用这个库则需要在安装中包含这个库。
1.勾选Qt VirtualKeyboard

如果安装时没有安装此库建议直接卸载重装可能会快一点。
2.ui设计流程
1)创建主窗口和按钮:
 创建一个新工程,在主窗口中放置一个按钮,并为其设置点击事件槽。
2)创建弹窗和文本输入框:
 创建一个新的弹窗ui,在其中创建文本输入框(例如QLineEdit),或通过代码实现。

 
3)实现弹窗的显示逻辑:
 在按钮的点击事件槽中,实例化并显示弹窗。
4)集成Qt VirtualKeyboard:
 在弹窗的文本输入框上设置焦点,并在需要时显示Qt VirtualKeyboard。
3.注意事项及问题点
1)在 widget 引用Qt VirtualKeyboard 需要在main函数加上这句(QApplication a(argc, argv)之前)。
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
2)在弹窗中使用键盘时弹窗需要设置为非阻塞模式(myDialog->show),否则键盘将不起作用。(也可以参考其它解决方式)。
// MyDialog myDialog;
// myDialog.exec(); 阻塞
myDialog->show();非阻塞
3)非阻塞模式下myDialog 变量如果为局部变量,那么弹窗运行时会直接一闪而过,因此不能用局部变量。
三、参考代码
以下代码参考自文心一言示例改装
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "mydialog.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private slots:
    void on_pushButton_clicked();
private:
    Ui::MainWindow *ui;
     MyDialog *myDialog;
};
#endif // MAINWINDOW_H
 
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow),
    myDialog(new MyDialog(this))
{
    ui->setupUi(this);
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_pushButton_clicked()
{
    //    MyDialog myDialog;
    //    myDialog.exec();
         myDialog->show();
}
 
mydialog.h
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include <QDialog>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QSlider>
namespace Ui {
class MyDialog;
}
class MyDialog : public QDialog
{
    Q_OBJECT
public:
    explicit MyDialog(QWidget *parent = nullptr);
    ~MyDialog();
private:
    Ui::MyDialog *ui;
    QLineEdit *lineEdit;
    QVBoxLayout *layout;
};
#endif // MYDIALOG_H
 
mydialog.cpp
#include "mydialog.h"
#include "ui_mydialog.h"
MyDialog::MyDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MyDialog)
{
    ui->setupUi(this);
    // 创建输入框
    lineEdit = new QLineEdit(this);
    lineEdit->setFocusPolicy(Qt::StrongFocus); // 确保可以接收焦点
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(lineEdit);  // 1 表示密码输入框可以扩展以填充可用空间
    // 设置对话框的布局
    setLayout(layout);
}
MyDialog::~MyDialog()
{
    delete ui;
}
 
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
 
四、总结
本文主要记录qt学习与使用过程中对键盘的使用,不得不说的是随着ai技术的发展,对新人学习相关的知识确实起到了不错的帮助,虽然只能提供简单的示例,但至少可以帮忙找到一个确切的方向。
参考博客
Qt对话框Dialog无法使用软键盘输入、Widget子窗口背景异常问题_qt无法对子窗口输入-CSDN博客



















