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

这个是qt的虚拟键盘。只要在对应的增加程序之前配置这个环境就可以直接用了。
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
int main(int argc, char *argv[])
{
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
屏蔽虚拟键盘
需求:有些简单的输入框有对应的数字键盘不想弹出虚拟键盘。可以重写输入控件。
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
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文件
#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;
}
}

1022

被折叠的 条评论
为什么被折叠?



